我想我只是缺少的東西,但這裏是我的設置,我有一個測試模塊與三個測試功能,我想設置$ 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
所以從側面中的函數
,在$腳本範圍存在,只是沒有在參數。也許我只是不明白示波器如何完全工作,謝謝任何幫助和/或澄清。
謝謝你的偉大的探索,現在讓我問你這個,如果我使用$ Global:Scope會不會那麼糟糕? 99%的時間,我永遠不會這樣做,但是,這可以追溯到我在https://github.com/dotps1/WinSCP上工作的模塊,基本上,首先必須完成的工作是創建一個Session對象,然後每個其他cmdlet都使用它,因此,我的代碼如下所示:'$ Global:PSDefaultParameterValues [「* - WinSCP *:WinSCPSession」] = $ session'。我認爲這不會影響任何其他cmdlet。再次感謝。 – dotps1
@ dotps1恕我直言,最好允許用戶通過h(im | er)self設置'$ PSDefaultParameterValues',如果(s)他想這樣做。主要問題,正如我所看到的,你的代碼是,有人可以用自定義前綴'Import-Module -Prefix custom'導入你的模塊。而你的默認參數不起作用。 – PetSerAl
我傾向於使用的一種解決方法:編寫存儲腳本範圍變量的Get-WinSCPConfig和Set-WinSCPConfig函數,並且可選地序列化磁盤以實現持久「默認」。將這些用作適當功能參數的默認值。執行不力的例子[這裏](https://github.com/RamblingCookieMonster/Infoblox)。乾杯! –