Как обрабатывать аргументы командной строки в PowerShell

Что такое "лучший" способ обработки аргументов командной строки?

Кажется, есть несколько ответов о том, что такое "лучший" способ, и в результате я зациклился на том, как обращаться с чем-то простым:

script.ps1 /n name /d domain

и

script.ps1 /d domain /n name.

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

Очевидно, что у меня уже нет довольно и, конечно же, не "лучшего", но оно работает.. и это UGLY.

for ( $i = 0; $i -lt $args.count; $i++ ) {
    if ($args[ $i ] -eq "/n"){ $strName=$args[ $i+1 ]}
    if ($args[ $i ] -eq "-n"){ $strName=$args[ $i+1 ]}
    if ($args[ $i ] -eq "/d"){ $strDomain=$args[ $i+1 ]}
    if ($args[ $i ] -eq "-d"){ $strDomain=$args[ $i+1 ]}
}
Write-Host $strName
Write-Host $strDomain

Ответ 1

Вы изобретаете колесо. Обычные сценарии PowerShell имеют параметры, начинающиеся с -, например script.ps1 -server http://devserver

Затем вы обрабатываете их в разделе param в начале файла (см. руководство: https://devcentral.f5.com/articles/powershell-abcs-p-is-for-parameters)

Вы также можете назначить значения по умолчанию вашим параметрам, прочитать их с консоли, если они недоступны, или остановить выполнение script:

 param (
    [string]$server = "http://defaultserver",
    [Parameter(Mandatory=$true)][string]$username,
    [string]$password = $( Read-Host "Input password, please" )
 )

Внутри script вы можете просто

write-output $server

поскольку все параметры становятся переменными, доступными в области script.

В этом примере $server получает значение по умолчанию, если script вызывается без него, script останавливается, если вы опускаете параметр -username и запрашиваете ввод терминала, если -password опущен.

Обновление: Вы также можете передать флаг "flag" (логический истинный/ложный параметр) в PowerShell script. Например, ваш script может принять "силу", когда script работает в более осторожном режиме, когда сила не используется.

Ключевое слово для этого типа [switch]:

 param (
    [string]$server = "http://defaultserver",
    [string]$password = $( Read-Host "Input password, please" ),
    [switch]$force = $false
 )

Внутри script вы будете работать с ним следующим образом:

if ($force) {
  //deletes a file or does something "bad"
}

Теперь при вызове script вы установите параметр switch/flag следующим образом:

.\yourscript.ps1 -server "http://otherserver" -force

Если вы явно хотите указать, что флаг не установлен, для него есть специальный синтаксис

.\yourscript.ps1 -server "http://otherserver" -force:$false

Ссылки на соответствующую документацию Microsoft (для PowerShell 5.0; версии 3.0 и 4.0 также доступны по ссылкам):