如何检查调用者是不是设置了 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 可选参数的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Chrome 中为 WebRTC 调用者设置远程描述而不会出错?
如何使用inspect从Python中的被调用者那里获取调用者的信息?