Como lidar com os argumentos da linha de comandos em PowerShell
parece que há várias respostas sobre o que é o" melhor " caminho 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 pode lidar com isso melhor? Sei que estou a reinventar a roda.
Obviamente, o que já tenho não é bonito e certamente não é o "melhor", mas funciona.. e é feio.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 answers
-
, Como script.ps1 -server http://devserver
Depois trata deles na secção param
no início do ficheiro.
Também pode atribuir valores predefinidos aos seus parâmetros, lê-os na consola, se não estiverem disponíveis, ou interromper a execução do programa:
param (
[string]$server = "http://defaultserver",
[Parameter(Mandatory=$true)][string]$username,
[string]$password = $( Read-Host "Input password, please" )
)
Dentro do guião podes simplesmente
write-output $server
, uma vez que todos os parâmetros se tornam variáveis disponíveis no script de escopo.
Neste exemplo, o $server
obtém um valor por omissão se o programa for chamado sem ele, o programa pára se omitir o parâmetro -username
e pedir a entrada do terminal se -password
for omitido.
Actualização: Você pode muito bem querer passar uma "bandeira" (um parâmetro booleano verdadeiro/falso) para um script PowerShell. Por exemplo, seu script pode aceitar uma "força" onde o script é executado em um modo mais cuidadoso quando a força não é usada.
A palavra-chave para isso é [switch]
Tipo de parâmetro:
param (
[string]$server = "http://defaultserver",
[string]$password = $( Read-Host "Input password, please" ),
[switch]$force = $false
)
Dentro do guião então você trabalharia com ele assim:
if ($force) {
//deletes a file or does something "bad"
}
Agora, ao ligar para o programa, você definiria o parâmetro switch / flag assim:
.\yourscript.ps1 -server "http://otherserver" -force
Se você quiser explicitamente afirmar que a bandeira não está definida, existe uma sintaxe especial para isso
.\yourscript.ps1 -server "http://otherserver" -force:$false
As ligações à documentação relevante da Microsoft (para o PowerShell 5.0; tho as versões 3.0 e 4.0 também estão disponíveis no links):