PowerShell中的函数范围变量(使用高级方法)?
有人可以告诉我我在这里失踪了什么吗?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)
}
}
我必须假设你正在使用PowerShell 2.0本。在该版本中,当您在Begin
块中设置参数值时,它将不会在Process
或End
块中保留该值。
这在Powershell 3.0+中进行了更改。
对于V2.0,分配非参数变量的参数的值,并使用该贯穿所有3块:
function Test-Cmdlet {
[CmdletBinding()]
Param (
[string] $Prepend,
[parameter(ValueFromPipeline=$true)] [string] $OtherString
)
BEGIN
{
if ($Prepend -eq $null) {
$doPrepend = ".."
} else {
$doPrepend = $Prepend
}
}
PROCESS
{
write-host ($doPrepend + $OtherString)
}
}
绝对正确,非常感谢。 – 2014-11-21 23:45:23
因为通过定义$Prepend
作为参数空字符串被创建这样你如果条件从不适用。 您可以检查空字符串,而不是检查$null
作为替代。
Regards
是的,好点,我通常使用'if(!$ Parameter){$ Parameter = ...}' – 2014-11-21 23:37:20
@SamPorch yep也可以,那么这是问题还是它仍然不能按预期工作? – Paul 2014-11-21 23:39:19
核心问题是在“开始”块中设置变量,但当然这也会导致问题。 – 2014-11-22 00:10:39
这样可以绕过这个问题,但是您可以不只是声明参数的默认值吗? '[string] $ Prepend =“..”,' – Matt 2014-11-22 02:40:36
@Matt,是的,但这只是一个示例问题,真正的问题不是设置默认值,而是更改BEGIN块中的参数 – 2014-11-25 08:48:34