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

时间:2017-08-25 11:50:21

标签: 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 } ... 的默认值,并避免将涉及将逻辑转移到函数的主体,例如:

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);
});
}

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

1 个答案:

答案 0 :(得分:1)

不幸的是,答案是否定的。 ParameterSet允许通过过滤掉不相关的参数集,为复杂的参数集提供更简单的用户界面。但是,PowerShell会遍历每个参数,无论它是否位于所选参数集中,并为参数指定默认值(如果指定参数)。因此,只需在您的问题的上下文中,可以将ParameterSet视为演示文稿的过滤器。