Почему необязательным параметрам не присваиваются позиции? Powershell - PullRequest
3 голосов
/ 09 мая 2020

Используя следующий пример функции:

Function Test {
  param(
    [Parameter(Position=0)]
    [string]$Optional="some optional string",
    [Parameter(Position=1, Mandatory=$true)]
    [string]$Required
  )
  Process { }
}

Я ожидал бы, что следующие будут идентичными:

Test -Optional "optional" "required"

и

Test "required"

Это не так, но Зачем? Необязательный параметр не является обязательным, но во втором примере не будет сказано:

Набор параметров не может быть разрешен с использованием указанных именованных параметров. Один или несколько выданных параметров не могут использоваться вместе, или было предоставлено недостаточное количество параметров.

Кажется естественным, что если указан только один параметр, он будет обязательным параметром, потому что он необходимо указать .

Есть ли способ выполнить sh то, что я пытаюсь сделать?

1 Ответ

1 голос
/ 09 мая 2020

Когда вы задаете параметру позицию перед обязательным, это не обязательно , но ожидается , что первый вход будет вашим необязательным параметром. Чтобы ваш второй пример работал, вам просто нужно удалить ссылку на позицию для необязательного параметра. Конечно, тогда Required будет первым параметром позиции или 0.

Function Test {
  param(
    [Parameter()]
    [string]$Optional,
    [Parameter(Position=0, Mandatory=$true)]
    [string]$Required
  )
  Process {
     Write-Host $Required
     if ($PSBoundParameters.ContainsKey('Optional')) {
        Write-Host $Optional -ForegroundColor Cyan
     }
  }
}

Я добавил некоторые выходные данные и удалил значение по умолчанию для параметра Optional, чтобы вы могли видеть, что происходит.

Если вы не хотите называть необязательный параметр, вы даете ему позицию выше, чем обязательные параметры.

Function Test {
  param(
    [Parameter(Position=1)]
    [string]$Optional,
    [Parameter(Position=0, Mandatory=$true)]
    [string]$Required
  )
  Process {
     Write-Host $Required
     if ($PSBoundParameters.ContainsKey('Optional')) {
        Write-Host $Optional -ForegroundColor Cyan
     }
  }
}

О дополнительных параметрах функций

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...