我明白了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/