2015-05-24 104 views
1

我想我只是缺少的東西,但這裏是我的設置,我有一個測試模塊與三個測試功能,我想設置$ PSDefaultParameterValues使一個共同的參數值只存在於所述模塊中的其他cmdlet。這裏是我的代碼:

test.psm1:

$PSDefaultParameterValues.Clear() 

"$(Split-Path -Path $MyInvocation.MyCommand.Path)\*.ps1" | Resolve-Path | % { . $_.ProviderPath } 

在同一個目錄,我有我的功能:

新TestFunction.ps1:

Function New-TestFunction 
{ 
    [CmdletBinding()] 
    [OutputType([String])] 

    Param 
    (
     [String] 
     $InputString 
    ) 

    $Script:PSDefaultParameterValues.Add("Write-TestValue:OutputValue", $InputString) 
} 

寫測試值。 ps1:

Function Write-TestValue 
{ 
    [CmdletBinding()] 
    [OutputType()] 

    Param 
    (
      [Parameter()] 
      [String] 
      $OutputValue 
    ) 

    Write-Output -InputObject $OutputValue 
} 

so,is應該可以這樣做:

PS C:\> New-TestFunction -InputString 'Test String'; Write-TestValue 
PS C:\> 'Test String' 

但它什麼也沒有返回,$ OutputValue仍然是$ null。我得到它的唯一方法是使用$ Global:範圍,我不想這麼做。我覺得像在Module範圍下導入的函數應該看到$ Script:變量的範圍。我寫了一個小測試功能:

寫ScriptPSDefaultParameterValues.ps1

Function Write-ScriptPSDefaultParameterValues 
{ 
    [CmdletBinding()] 
    [OutputType()] 

    Param 
    (
    ) 

    Write-Output -InputObject $Script:PSDefaultParameterValues 
} 

而且這個工程:

PS C:\> New-TestFunction -InputString 'Test String'; Write-ScriptPSDefaultParameterValues 
Name       Value 
----       ----- 
Write-TestValue:OutputValue Test String 
所以從側面中的函數

,在$腳本範圍存在,只是沒有在參數。也許我只是不明白示波器如何完全工作,謝謝任何幫助和/或澄清。

回答

3

$PSDefaultParameterValues從調用發生的範圍讀取,而不是從函數定義的範圍讀取。

New-Module { 
    [email protected]{'F:Value'=10} 
    function F{ 
     [CmdletBinding()] 
     param(
      $Value 
     ) 
     "F:`$Value:$Value" 
    } 
    function G{ 
     [CmdletBinding()] 
     param(
      $Value 
     ) 
     "G:`$Value:$Value" 
    } 
    function Invoke-F{ 
     F 
    } 
    function Invoke-G{ 
     G 
    } 
}|Out-Null 
[email protected]{'G:Value'=20} 
F 
G 
Invoke-F 
Invoke-G 

結果:

F:$Value: 
G:$Value:20 
F:$Value:10 
G:$Value: 

所以,當從功能全局範圍內執行,那麼全球$PSDefaultParameterValues得到讀。當從其他模塊功能執行功能時,則讀取模塊$PSDefaultParameterValues

+0

謝謝你的偉大的探索,現在讓我問你這個,如果我使用$ Global:Scope會不會那麼糟糕? 99%的時間,我永遠不會這樣做,但是,這可以追溯到我在https://github.com/dotps1/WinSCP上工作的模塊,基本上,首先必須完成的工作是創建一個Session對象,然後每個其他cmdlet都使用它,因此,我的代碼如下所示:'$ Global:PSDefaultParameterValues [「* - WinSCP *:WinSCPSession」] = $ session'。我認爲這不會影響任何其他cmdlet。再次感謝。 – dotps1

+2

@ dotps1恕我直言,最好允許用戶通過h(im | er)self設置'$ PSDefaultParameterValues',如果(s)他想這樣做。主要問題,正如我所看到的,你的代碼是,有人可以用自定義前綴'Import-Module -Prefix custom'導入你的模塊。而你的默認參數不起作用。 – PetSerAl

+0

我傾向於使用的一種解決方法:編寫存儲腳本範圍變量的Get-WinSCPConfig和Set-WinSCPConfig函數,並且可選地序列化磁盤以實現持久「默認」。將這些用作適當功能參數的默認值。執行不力的例子[這裏](https://github.com/RamblingCookieMonster/Infoblox)。乾杯! –