pok*_*oke 3 powershell optional-parameters strict-mode
我有一个 PowerShell 函数,它接受一个可选参数,使用 a 进行验证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
}
Run Code Online (Sandbox Code Playgroud)
该脚本在使用A
或B
作为第一个参数调用时有效,但在省略该参数时失败。有趣的是,如果我从参数定义中删除 theParameterAttribute
或 the ValidateSetAttribute
,它就会起作用。
我当前的解决方法是使用访问变量$PSBoundParameters
并检查是否设置了参数,如下所示:
if ($PSBoundParameters.ContainsKey('Target') -and $PSBoundParameters.Target -eq 'B') {
# Add new parameter here...
}
Run Code Online (Sandbox Code Playgroud)
虽然这工作正常,但如果我想检查该值,它有一个缺点A
:作为A
参数的默认值,$PSBoundParameters
当省略参数并应用默认值时,它不会被添加到。所以我需要修改我的支票以明确检查:
if (-not $PSBoundParameters.ContainsKey('Target') -or $PSBoundParameters.Target -eq 'A')) {
# Add new parameter here...
}
Run Code Online (Sandbox Code Playgroud)
我不太喜欢这个解决方案,因为它会不必要地将动态参数添加与默认值联系起来。理想情况下,我希望能够更改默认值而无需触及任何其他内容。有没有办法从DynamicParam
块内访问实际参数值?或者至少有可能访问参数定义并访问默认值?
如果您需要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
}
Run Code Online (Sandbox Code Playgroud)