Как обрабатывать аргументы командной строки в 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 также доступны на сайте ссылки):
Comments