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

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

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

script.ps1 /n name /d domain

и

script.ps1 /d domain /n name.

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

очевидно, что то, что у меня уже есть, не очень красиво и, конечно, не "лучшее", но это работает.. и это УРОДЛИВЫЙ.

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 раздел в начале файла.

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

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

внутри скрипта вы можете просто

write-output $server

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

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

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

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

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

внутри скрипта, тогда вы будете работать с ним следующим образом:

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

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

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

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

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

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