2014-11-21 38 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