如何检查PowerShell开关参数是否缺失或为false

时间:2019-06-28 15:27:57

标签: powershell

我正在构建用于构建哈希表的PowerShell函数。我正在寻找一种可以使用switch参数指定为不存在,正确或错误的方法。我该如何确定?

我可以通过使用[boolean]参数来解决此问题,但我发现这不是一个很好的解决方案。另外,我也可以使用两个开关参数。

function Invoke-API {
    param(
        [switch]$AddHash
    )

    $requestparams = @{'header'='yes'}

    if ($AddHash) {
        $requestparams.Code = $true
    }

在指定false时如何显示为false,而在未指定switch参数时如何显示为空?

3 个答案:

答案 0 :(得分:8)

要检查调用者是否传递了参数,请检查$PSBoundParameters自动变量:

if($PSBoundParameters.ContainsKey('AddHash')) {
    # switch parameter was explicitly passed by the caller
    # grab its value
    $requestparams.Code = $AddHash.IsPresent
}
else {
    # parameter was absent from the invocation, don't add it to the request 
}

如果要传递多个开关参数,请遍历$PSBoundParameters中的条目并测试每个值的类型:

param(
  [switch]$AddHash,
  [switch]$AddOtherStuff,
  [switch]$Yolo
)

$requestParams = @{ header = 'value' }

$PSBoundParameters.GetEnumerator() |ForEach-Object {
  $value = $_.Value
  if($value -is [switch]){
    $value = $value.IsPresent
  }

  $requestParams[$_.Key] = $value
}

答案 1 :(得分:2)

您可以使用PSBoundParameter进行检查

PS C:\ > function test-switch {
   param (
    [switch]$there = $true
   )
   if ($PSBoundParameters.ContainsKey('there')) {
       if ($there) {
          'was passed in'
       } else {
          'set to false'
       }
   } else {
       'Not passed in'
   }
}

enter image description here

答案 2 :(得分:0)

如果您的参数可以是$true$false或未指定,那么您可能不希望使用[Switch]参数类型,因为它只能是$true或{ {1}}($false与未指定相同)。或者,可以使用可为空的布尔参数。示例:

$false