param - Como lidar com argumentos de linha de comando no PowerShell
powershell arg 0 (1)
Qual é a melhor maneira de lidar com argumentos de linha de comando?
Parece que há várias respostas sobre qual é a "melhor" maneira e, como resultado, estou preso em como lidar com algo tão simples como:
script.ps1 /n name /d domain
E
script.ps1 /d domain /n name.
Existe um plugin que possa lidar com isso melhor? Eu sei que estou reinventando a roda aqui.
Obviamente, o que eu já não é bonito e certamente não é o "melhor", mas funciona ... e é feia.
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
https://ffff65535.com
Você está reinventando a roda. Os scripts normais do PowerShell têm parâmetros que começam com -
, como script.ps1 -server http://devserver
Então você os manipula na seção param
no começo do arquivo.
Você também pode atribuir valores padrão aos seus parâmetros, lê-los no console, se não estiver disponível, ou parar a execução do script:
param (
[string]$server = "http://defaultserver",
[Parameter(Mandatory=$true)][string]$username,
[string]$password = $( Read-Host "Input password, please" )
)
Dentro do roteiro você pode simplesmente
write-output $server
já que todos os parâmetros se tornam variáveis disponíveis no escopo do script.
Neste exemplo, o $server
recebe um valor padrão se o script é chamado sem ele, o script pára se você omitir o parâmetro -username
e solicita a entrada do terminal se -password
for omitido.
Atualização: você também pode querer passar um "flag" (um parâmetro booleano verdadeiro / falso) para um script do PowerShell. Por exemplo, seu script pode aceitar uma "força" em que o script é executado em um modo mais cuidadoso quando a força não é usada.
A palavra-chave para esse é o tipo de parâmetro [switch]
:
param (
[string]$server = "http://defaultserver",
[string]$password = $( Read-Host "Input password, please" ),
[switch]$force = $false
)
Dentro do roteiro, você trabalharia assim:
if ($force) {
//deletes a file or does something "bad"
}
Agora, ao chamar o script, você configuraria o parâmetro switch / flag assim:
.\yourscript.ps1 -server "http://otherserver" -force
Se você deseja declarar explicitamente que o sinalizador não está definido, há uma sintaxe especial para isso
.\yourscript.ps1 -server "http://otherserver" -force:$false
Links para documentação relevante da Microsoft (para o PowerShell 5.0; tho versões 3.0 e 4.0 também estão disponíveis nos links):