[英]Parameters with default value not in PsBoundParameters?
一般代碼
考慮以下代碼:
PS> function Test { param($p='default value') $PsBoundParameters }
PS> Test 'some value'
Key Value
--- -----
p some value
PS> Test
# nothing
我希望$PsBoundParameters
在兩種情況下都包含$p
變量的記錄。 這是正確的行為嗎?
題
我想使用這樣的splatting來實現很多功能:
function SomeFuncWithManyRequiredParams {
param(
[Parameter(Mandatory=$true)][string]$p1,
[Parameter(Mandatory=$true)][string]$p2,
[Parameter(Mandatory=$true)][string]$p3,
...other parameters
)
...
}
function SimplifiedFuncWithDefaultValues {
param(
[Parameter(Mandatory=$false)][string]$p1='default for p1',
[Parameter(Mandatory=$false)][string]$p2='default for p2',
[Parameter(Mandatory=$false)][string]$p3='default for p3',
...other parameters
)
SomeFuncWithManyRequiredParams @PsBoundParameters
}
我不想用枚舉的所有參數調用SomeFuncWithManyRequiredParams:
SomeFuncWithManyRequiredParams -p1 $p1 -p2 $p2 -p3 $p3 ...
可能嗎?
我知道這個問題已經很老了,但我最近需要這樣的東西(想要用很多默認參數進行噴塗)。 我想出了這個並且效果很好:
$params = @{}
foreach($h in $MyInvocation.MyCommand.Parameters.GetEnumerator()) {
try {
$key = $h.Key
$val = Get-Variable -Name $key -ErrorAction Stop | Select-Object -ExpandProperty Value -ErrorAction Stop
if (([String]::IsNullOrEmpty($val) -and (!$PSBoundParameters.ContainsKey($key)))) {
throw "A blank value that wasn't supplied by the user."
}
Write-Verbose "$key => '$val'"
$params[$key] = $val
} catch {}
}
無恥的插件 :我決定把它變成一篇博文,里面有更多的解釋和一個示例用法腳本 。
這取決於你如何定義“綁定”我猜是即從用戶提供的值綁定的值或函數提供的默認值? 老實說,它並沒有讓我感到驚訝的是它的行為方式,因為我認為“綁定”意味着前者 - 從用戶輸入綁定。 無論如何,你可以通過修補$ PSBoundParameters變量來解決這個問題,例如:
function SimplifiedFuncWithDefaultValues {
param(
[Parameter(Mandatory=$false)][string]$p1='default for p1',
[Parameter(Mandatory=$false)][string]$p2='default for p2',
[Parameter(Mandatory=$false)][string]$p3='default for p3',
...other parameters
)
if (!$PSBoundParameters.ContainsKey(p1))
{
$PSBoundParameters.p1 = 'default for p1'
}
# rinse and repeat for other default parameters.
SomeFuncWithManyRequiredParams @PSBoundParameters
}
您可以使用類似於下面的Add-Variable
函數的輔助函數:
function SimplifiedFuncWithDefaultValues {
param(
[Parameter(Mandatory=$false)][string]$p1='default for p1',
[Parameter(Mandatory=$false)][string]$p2='default for p2',
[Parameter(Mandatory=$false)][string]$p3='default for p3',
...other parameters
)
$PSBoundParameters | Add-Variable p1, p2, p3
SomeFuncWithManyRequiredParams @PSBoundParameters
}
function Add-Variable {
param(
[Parameter(Position = 0)]
[AllowEmptyCollection()]
[string[]] $Name = @(),
[Parameter(Position = 1, ValueFromPipeline, Mandatory)]
$InputObject
)
$Name |
? {-not $InputObject.ContainsKey($_)} |
% {$InputObject.Add($_, (gv $_ -Scope 1 -ValueOnly))}
}
這就是我喜歡做的事情:
foreach($localP in $MyInvocation.MyCommand.Parameters.Keys)
{
if(!$PSBoundParameters.ContainsKey($localP))
{
$PSBoundParameters.Add($localP, (Get-Variable -Name $localP -ValueOnly))
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.