我有一个PowerShell函数,它接受一个可选参数,使用ValidateSetAttribute
验证,并根据该值添加另一个动态参数。但是,在严格模式下,当试图访问DynamicParam
块内的参数时,我没有明确地设置所述参数,那么我得到一个错误,即变量未定义
Param(
[Parameter()]
[ValidateSet('A', 'B')]
[string] $Target = 'A'
)
DynamicParam {
if ($Target -eq 'B') { # <- Here it fails
# Add new parameter here...
}
}
end {
Write-Host $Target
}
当使用A
或B
作为第一个参数调用时,脚本可以正常工作,但在省略参数时会失败。有趣的是,如果我从参数定义中移除ParameterAttribute
或ValidateSetAttribute
,它就可以工作。
我目前的解决方法是使用$PSBoundParameters
访问变量并检查参数是否已设置,如下所示:
if ($PSBoundParameters.ContainsKey('Target') -and $PSBoundParameters.Target -eq 'B') {
# Add new parameter here...
}
虽然这样可行,但如果我想检查值A
,则有一个缺点:由于A
是参数的默认值,它不会是省略参数并应用默认值时,将$PSBoundParameters
添加到if (-not $PSBoundParameters.ContainsKey('Target') -or $PSBoundParameters.Target -eq 'A')) {
# Add new parameter here...
}
。所以我需要修改我的支票以明确检查:
DynamicParam
我真的不喜欢这个解决方案,因为它会不必要地将动态参数添加与默认值联系起来。理想情况下,我希望能够更改默认值而无需触及任何其他内容。有没有办法从{{1}}块中访问实际参数值?或者是否至少有可能访问参数定义并访问默认值?
答案 0 :(得分:4)
如果您需要在PSDebug
模式(strict
)中运行set-psdebug -strict
时正确运行,您可以执行以下操作:
Param(
[Parameter()]
[ValidateSet('A', 'B')]
[string] $Target = 'A'
)
DynamicParam {
# Ensure $Target is defined
try { [void]$Target }
catch { $Target = [string]::Empty }
if ($Target -eq 'B') {
write-host "si si"
}
}
end {
Write-Host $Target
}