如何检查调用者是否设置了PowerShell可选参数

时间:2018-02-06 12:36:49

标签: powershell

我有一个带有这些参数的脚本:

param (
    [parameter(Mandatory=$true)][ValidateRange(1, [int]::MaxValue)]
    [Int]$startRevision,

    [parameter(Mandatory=$true)][ValidateRange(1, [int]::MaxValue)]
    [Int]$endRevision,

    [parameter(Mandatory=$false)][ValidateRange(1, [int]::MaxValue)]
    [Int]$stepSize = 10,

    [parameter(Mandatory=$false)]
    [String]$applicationToBuild
)

由于最后一个参数是可选的,我想知道参数是否已设置。有没有办法做到这一点?

默认设置不正常,因为如果没有设置变量,我不想使用它。我可以使用默认值“ThisIsNotSet”并检查该值是否等于此字符串,但是有更好的解决方案吗?

3 个答案:

答案 0 :(得分:17)

$PSBoundParameters 是类似哈希表的对象,其 .Keys属性包含参数所有参数的名称在调用时被明确传递 [1]

因此,在您的情况下,$PSBoundParameters.ContainsKey('applicationToBuild')会告诉您参数是否传递给-applicationToBuild(表达式计算结果为$True)或不传递($False)。

注意:此方法的优点是明确,而测试参数变量类型的默认值(如trbox' answer中所示)并非如此允许您区分不传递参数和显式传递类型的默认值(在这种情况下为空字符串)。

[1]请注意,通过默认值隐式绑定的参数不包含 ;包括后者在将参数传递给另一个函数时会有所帮助,如this GitHub issue中所述。

答案 1 :(得分:0)

如果没有任何内容传递给脚本,则

$applicationToBuild为空字符串,因为参数的类型为[String]
 因此,如果参数“未设置”,则$applicationToBuild.Length将为0

您可以在决定是否使用参数时使用它。

答案 2 :(得分:0)

Here的另一种选择,通过将参数类型指定为开关