有人可以告诉我我在这里失踪了什么吗?PowerShell中的函数范围变量(使用高级方法)?
function Test-Cmdlet {
[CmdletBinding()]
Param (
[string] $Prepend,
[parameter(ValueFromPipeline=$true)] [string] $OtherString
)
BEGIN
{
if ($Prepend -eq $null) {
$Prepend = ".."
}
}
PROCESS
{
write-host ($Prepend + $OtherString)
}
}
# success:
PS> @("ab", "cd") | Test-Cmdlet "-"
-ab
-cd
# failure:
PS> @("ab", "cd") | Test-Cmdlet
ab
cd
# should be:
..ab
..cd
为什么$前置没有得到设置?
我试过在BEGIN/PROCESS块之外声明变量,但解释器不接受这个。
我试过使用:Set-Variable -Name "Prepend" -Value ".." -Scope 1
(和范围0和范围2),而不是:$Prepend = ".."
,但仍然没有任何工作。
我熟悉$global:Variable
,但任何想法如何使用高级方法在cmdlet中获取函数范围的变量?
编辑:
的解决方案,如下面,就是:
function Test-Cmdlet {
[CmdletBinding()]
Param (
[string] $Prepend,
[parameter(ValueFromPipeline=$true)] [string] $OtherString
)
BEGIN
{
$_prepend = $Prepend
if (!$Prepend) {
$_prepend = ".."
}
}
PROCESS
{
write-host ($_prepend + $OtherString)
}
}
这样可以绕过这个问题,但是您可以不只是声明参数的默认值吗? '[string] $ Prepend =“..”,' – Matt 2014-11-22 02:40:36
@Matt,是的,但这只是一个示例问题,真正的问题不是设置默认值,而是更改BEGIN块中的参数 – 2014-11-25 08:48:34