Como lidar com os argumentos da linha de comandos em PowerShell

Qual é a melhor maneira de lidar com os argumentos da linha de comandos?

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
Author: Ryan Gates, 2010-01-28

1 answers

Estás a reinventar a roda. Scripts PowerShell normais têm parâmetros começando com -, 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):

 692
Author: naivists, 2018-08-17 18:37:13