powershell - 如果参数集未被使用,有没有办法让 Powershell 函数忽略默认参数的值?

标签 powershell

我明白了from this answer当你在 Powershell 函数中有默认参数和多个参数集时,默认参数值将被实例化,即使正在使用的参数集不是它们插入的参数集。 有没有办法避免这种情况?

例如,在下面的函数中,假设有一个非常昂贵的计算用于计算 $FirstParameter 的默认值,我想在不需要时避免使用它:

function PrintStuff {
    [CmdletBinding(DefaultParameterSetName='FirstSet')]
    Param(
        [Parameter(ParameterSetName='FirstSet')]
        [String]$FirstParameter=(ReallyExpensiveFunction),

        [Parameter(ParameterSetName='SecondSet')]
        [String]$SecondParameter
    )

    if (-not ($FirstParameter -eq $null)) {Write-Host $FirstParameter}
    Write-Host "$($PSCmdlet.ParameterSetName)"
}

function ReallyExpensiveFunction {
    # Very expensive calculation
    "I Am First"
}

但是,目前运行它仍然会给我以下结果:

PS C:\> PrintStuff
# I Am First
# FirstSet

PS C:\> PrintStuff -SecondParameter "don't print this"
# I Am First
# SecondSet

如上所述,当使用 SecondSet 时,$FirstParameter 仍在定义中。有没有办法在使用第二个参数集时只打印SecondSet

请记住,我正在寻找是否有一种解决方案可以让我将 ReallyExpensiveFunction 保留为 $FirstParameter 的默认值,并避免解决方案这将涉及将逻辑转移到函数体,例如:

...
    Param(
        [Parameter(ParameterSetName='FirstSet')]
        [String]$FirstParameter,
    ...
    )

    if ($PSCmdlet.ParameterSetName -eq 'FirstSet' -and ($FirstParameter -eq '')) {
        $FirstParameter = ReallyExpensiveFunction
    }
...

抱歉,如果音调太具体,但我很想知道这是否可行。

最佳答案

很遗憾,答案是否定的。 ParameterSet 允许通过过滤掉不相关的参数集,为用户提供一个更简单的界面来处理复杂的参数集。但是,PowerShell 会遍历每个参数,无论它是否在选定的参数集中,并为参数分配默认值(如果您指定一个参数)。因此,简单地放在您的问题的上下文中,ParameterSet 可能被认为只是一个用于演示的过滤器。

关于powershell - 如果参数集未被使用,有没有办法让 Powershell 函数忽略默认参数的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45880763/

相关文章:

c# - 从 x64 C# 应用程序调用 x86 PowerShell 脚本

c# - PowerShell 中的参数属性默认值 (C# cmdlet)

powershell - 如何强制 powershell 重新加载自定义模块?

PowerShell - 使用“删除项目”之前关闭文件

powershell - 我需要我的脚本在 -Whatif 输出中包含 "LastWriteTime"属性

powershell - 在远程服务器上转发Invoke-Command的输出

powershell - TPM 和私钥保护

powershell - 命令后未定义 $LASTEXITCODE

powershell - 为什么我的 foreach 变量在每次迭代后没有进入 PowerShell 中的输出?

c# - .NET API 运行 powershell 脚本