2014-11-21 66 views
2

有人可以告诉我我在这里失踪了什么吗?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) 
    } 
} 
+0

这样可以绕过这个问题,但是您可以不只是声明参数的默认值吗? '[string] $ Prepend =“..”,' – Matt 2014-11-22 02:40:36

+0

@Matt,是的,但这只是一个示例问题,真正的问题不是设置默认值,而是更改BEGIN块中的参数 – 2014-11-25 08:48:34

回答

1

我必须假设你正在使用PowerShell 2.0本。在该版本中,当您在Begin块中设置参数值时,它将不会在ProcessEnd块中保留该值。

这在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) 
    } 
} 
+0

绝对正确,非常感谢。 – 2014-11-21 23:45:23

2

因为通过定义$Prepend作为参数空字符串被创建这样你如果条件从不适用。 您可以检查空字符串,而不是检查$null作为替代。

Regards

+0

是的,好点,我通常使用'if(!$ Parameter){$ Parameter = ...}' – 2014-11-21 23:37:20

+0

@SamPorch yep也可以,那么这是问题还是它仍然不能按预期工作? – Paul 2014-11-21 23:39:19

+0

核心问题是在“开始”块中设置变量,但当然这也会导致问题。 – 2014-11-22 00:10:39