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

Posted

技术标签:

【中文标题】如何检查调用者是不是设置了 PowerShell 可选参数【英文标题】:How to check if a PowerShell optional argument was set by caller如何检查调用者是否设置了 PowerShell 可选参数 【发布时间】:2018-07-16 12:43:03 【问题描述】:

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

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”并检查该值是否等于该字符串,但有更好的解决方案吗?

【问题讨论】:

【参考方案1】:

$PSBoundParameters 自动变量 是一个类似哈希表的对象,可在函数中使用,其 .Keys 属性 包含 参数所在的所有参数的名称在调用时显式传递[1]

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


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


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

【讨论】:

【参考方案2】:

如果没有向脚本传递任何内容,$applicationToBuild 是一个空字符串,因为参数的类型是 [String]。 所以如果参数“未设置”,$applicationToBuild.Length 将是0

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

【讨论】:

除非你需要区分“未通过”和“通过为空”的情况。 你是对的。无论如何,mklement0 的解决方案要好得多,是应该使用的解决方案。

以上是关于如何检查调用者是不是设置了 PowerShell 可选参数的主要内容,如果未能解决你的问题,请参考以下文章

使用 gdb 检查调用者帧

如何在 Chrome 中为 WebRTC 调用者设置远程描述而不会出错?

如何使用inspect从Python中的被调用者那里获取调用者的信息?

如何检查是不是启用了 Java Access Bridge? (电源外壳)

如何使用堆栈跟踪或反射找到方法的调用者?

如何知道调用者类 C# [重复]