powershell - 动态参数取默认值

标签 powershell optional-parameters strict-mode

我有一个采用可选参数的 PowerShell 函数,使用 ValidateSetAttribute 进行验证,并根据该值添加另一个动态参数。但是,在严格模式下,当试图访问 DynamicParam block 内的参数时,我没有明确设置所述参数,然后我得到一个错误,即变量未定义。

Param(
    [Parameter()]
    [ValidateSet('A', 'B')]
    [string] $Target = 'A'
)
DynamicParam {
    if ($Target -eq 'B') { # <- Here it fails
        # Add new parameter here...
    }
}
end {
    Write-Host $Target
}

脚本在以 AB 作为第一个参数调用时有效,但在省略参数时失败。有趣的是,如果我从参数定义中删除 ParameterAttributeValidateSetAttribute 它会起作用。

我当前的解决方法是使用 $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 block 中访问实际参数值?或者至少有可能访问参数定义并访问默认值?

最佳答案

如果你需要在 PSDebugstrict 模式(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
}

关于powershell - 动态参数取默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15114615/

相关文章:

javascript - 我们必须注意 JavaScript "strict mode"吗?

javascript - 我可以为特定功能禁用 ECMAscript 严格模式吗?

powershell - 展平文件,包括文件名中的文件夹名

powershell - Powershell:Get-Process不会返回远程描述

PowerShell HashTable - 初始化期间的自引用

c++ - 为什么可选参数不能与模板一起使用?

c# - 是否可以在 c# 的 lambda 表达式中使用可选/默认参数?

c# - C# 中有类似 PHP 的可选参数吗?

testing - 如何从命令行以管理员身份运行应用程序 (TestComplete)

javascript - 有没有办法检查是否强制执行严格模式?