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):





command-line-arguments