Сценарий Powershell как обрабатывать параметры, которые передаются непосредственно в модуль

#powershell

#powershell

Вопрос:

Я создаю оболочку, и в моем ps1 файле я хочу вызвать:

ConnectTo-PSSession -Path "test" -Confirm

Поскольку я хочу завершить этот вызов, я создал файл ps1 с теми же параметрами:

 Param(
  [string]$Path,
  [switch]Confirm
)
 

Теперь я хотел бы вызвать ConnectTo-PSSession с этими параметрами, но основная проблема заключается в том, что я не хочу даже вызывать флаг, если он не требуется:

ConnectTo-PSSession -Path $Path $Confirm //Confirm here is not working

Я взглянул Invoke-Expression , но, похоже, у него будут проблемы с безопасностью. Есть ли способ для меня достичь моего результата без Invoke-Expression ? Я, конечно, могу начать писать If инструкции, но это плохо масштабируется с несколькими параметрами, поскольку мне понадобится безумное количество этих проверок.

Ответ №1:

Поскольку вы Confirm указали параметр в качестве параметра переключения (но забыли добавить к нему знак доллара), измените сценарий следующим образом:

 Param(
  [string]$Path,
  [switch]$Confirm
)
ConnectTo-PSSession -Path $Path -Confirm:$Confirm
 

Теперь, если вы вызовете этот скрипт с -Confirm помощью переключателя, он будет интерпретироваться как $true, тогда как при выключении swith ConnectTo-PSSession с подтверждением интерпретируется как $false

Ответ №2:

Две вещи:

вы можете указать значение по умолчанию в блоке параметров:

 Param(
  [string]$Path = $PWD ,
  [switch]$Confirm = $True
)
 

Параметр Switch не будет принимать значение $Confirm без специального вызова. Чтобы указать параметр переключателя, используйте ... -Confirm:$Confirm без пробела после :

Комментарии:

1. Почему вы присваиваете параметру switch значение по умолчанию $True, когда он уже имеет значение по умолчанию $False, когда его нет в вызове?

2. @Theo зависит от того, как вы его реализуете. Я видел много параметров переключения, которые делают противоположное тому, что предполагает их название. Другие инвертируются -NoConfirmation , как или что-то в этом роде. В одном из моих сценариев я вычисляю значение переключателя на основе uppon, если заполнен другой параметр: [switch]$useGUI = $([string]::IsNullOrEmpty($CsvPath)) > Переключатель $true , если не CsvPath указано. в этом случае я показываю графический интерфейс. В противном случае сценарий представляет собой чистую командную строку. Но я могу заставить его отображать графический интерфейс и также указать путь!

3. Но тогда я предлагаю вам определить его как [bool] и не использовать [switch] вопреки тому, для чего он предназначен..