我理解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
}
...
的默认值,并避免将涉及将逻辑转移到函数的主体,例如:
window.onchange = function () {
var Employee = function(name, bd){
this.name = name.value;
this.bd = bd.value;
this.age = function(){
2017 - this.bd;
}
}
var empName = document.getElementById("name")
var empBday = document.getElementById("bday")
var empList = new Employee(empName, empBday);
var Btn = document.getElementById('add').addEventListener('click', function(){
console.log(empList);
});
}
很抱歉,如果音调太具体,但我很想知道这是否可行。
答案 0 :(得分:1)
不幸的是,答案是否定的。 ParameterSet允许通过过滤掉不相关的参数集,为复杂的参数集提供更简单的用户界面。但是,PowerShell会遍历每个参数,无论它是否位于所选参数集中,并为参数指定默认值(如果指定参数)。因此,只需在您的问题的上下文中,可以将ParameterSet视为演示文稿的过滤器。