Как проверить, отсутствует или нет параметр переключателя PowerShell - PullRequest
3 голосов
/ 28 июня 2019

Я создаю функцию PowerShell, которая создает хеш-таблицу. Я ищу способ, которым я могу использовать параметр переключателя, который будет указан как отсутствующий, true или false. Как я могу это определить?

Я могу решить эту проблему с помощью параметра [boolean], но я не нашел это элегантное решение. В качестве альтернативы я мог бы также использовать два параметра переключателя.

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

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

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

Как заставить его отображать false, если указано false, и ничего, если параметр switch не указан?

Ответы [ 3 ]

8 голосов
/ 28 июня 2019

Чтобы проверить, был ли параметр передан вызывающей стороной или нет, проверьте автоматическую переменную $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
}
2 голосов
/ 28 июня 2019

Вы можете использовать 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

0 голосов
/ 28 июня 2019

Если у вас есть параметр, который может быть $true, $false или не указан, то вам может не потребоваться тип параметра [Switch], поскольку он может быть только $true или $false ($false - этотак же, как не указано).В качестве альтернативы вы можете использовать логический параметр, допускающий значение NULL.Пример:

function Test-Boolean {
  param(
    [Nullable[Boolean]] $Test
  )

  if ( $Test -ne $null ) {
    if ( $Test ) {
      "You specified -Test `$true"
    }
    else {
      "You specified -Test `$false"
    }
  }
  else {
    "You did not specify -Test"
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...