Frage

Was ist die „beste“ Art und Weise zu handhaben Befehlszeilenargumente?

Es scheint so, gibt es mehrere Antworten auf das, was die „beste“ Weg ist, und als Ergebnis bin ich fest, wie etwas so einfach zu handhaben wie:

script.ps1 /n name /d domain

und

script.ps1 /d domain /n name.

Gibt es ein Plugin, das dies besser umgehen kann? Ich weiß, dass ich das Rad neu erfinden hier.

Natürlich, was ich habe schon nicht schön ist und sicherlich nicht die „beste“, aber es funktioniert .. und es ist häßlich.

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
War es hilfreich?

Lösung

Sie sind das Rad neu erfinden. Normale Powershell-Skripts haben Parameter mit - starten, wie script.ps1 -server http://devserver

Dann behandeln Sie sie in param Abschnitt am Anfang der Datei.

Sie können auch assign Standardwerte zu Ihrem params, lesen sie von der Konsole, wenn nicht verfügbar oder Stop-Skriptausführung:

 param (
    [string]$server = "http://defaultserver",
    [Parameter(Mandatory=$true)][string]$username,
    [string]$password = $( Read-Host "Input password, please" )
 )

Im Inneren des Skripts können Sie einfach

write-output $server

da alle Parameter Variablen in Skriptbereich verfügbar sind.

In diesem Beispiel wird die $server erhält einen Standardwert, wenn das Skript ohne sie genannt wird, Skript stoppt, wenn Sie den -username Parameter weglassen und fragt nach Terminal-Eingang, wenn -password weggelassen wird.

Update: Vielleicht möchten Sie auch eine „Fahne“ zu übergeben (ein boolean true / false-Parameter) zu einem Powershell-Skript. Zum Beispiel kann das Skript eine „Kraft“ annehmen, wenn das Skript ausgeführt wird in einer sorgfältigere Modus, wenn die Kraft nicht verwendet wird.

Das Schlüsselwort dafür ist [switch] Parametertyp:

 param (
    [string]$server = "http://defaultserver",
    [string]$password = $( Read-Host "Input password, please" ),
    [switch]$force = $false
 )

Im Innern das Skript dann würden Sie es wie folgt funktionieren:

if ($force) {
  //deletes a file or does something "bad"
}

Nun, wenn das Skript aufrufen Sie den Schalter / Flag-Parameter wie folgt gesetzt werden würde:

.\yourscript.ps1 -server "http://otherserver" -force

Wenn Sie ausdrücklich darauf hinweisen möchten, dass die Flagge nicht gesetzt ist, gibt es eine spezielle Syntax für die

.\yourscript.ps1 -server "http://otherserver" -force:$false

Links zu entsprechender Dokumentation von Microsoft (für Powershell 5.0; tho Versionen 3.0 und 4.0 sind auch bei den Links zur Verfügung):

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top