it-swarm.com.de

Behandlung von Befehlszeilenargumenten in PowerShell

Was ist die "beste" Art, mit Befehlszeilenargumenten umzugehen?

Es scheint, als gäbe es mehrere Antworten auf die Frage, was der "beste" Weg ist, und als Folge davon bin ich nicht sicher, wie ich mit so etwas Einfachem umgehen soll:

script.ps1 /n name /d domain

UND

script.ps1 /d domain /n name.

Gibt es ein Plugin, das das besser kann? Ich weiß, ich erfinde das Rad hier neu.

Offensichtlich ist das, was ich bereits habe, nicht hübsch und sicherlich nicht das "Beste", aber es funktioniert ... und es ist hässlich.

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
442
Aaron Wurthmann

Sie erfinden das Rad neu. Normale PowerShell-Skripte haben Parameter, die mit - beginnen, z. B. script.ps1 -server http://devserver.

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

Sie können Ihren Parametern auch Standardwerte zuweisen, sie von der Konsole aus lesen, wenn sie nicht verfügbar sind, oder die Skriptausführung stoppen:

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

Innerhalb des Skripts können Sie einfach

write-output $server

da alle Parameter Variablen werden, die im Skriptbereich verfügbar sind.

In diesem Beispiel erhält der $server einen Standardwert, wenn das Skript ohne diesen aufgerufen wird. Das Skript stoppt, wenn Sie den Parameter -username weglassen, und fordert zur Eingabe eines Terminals auf, wenn -password weggelassen wird.

Update: Sie können auch ein "Flag" (ein boolescher True/False-Parameter) an ein PowerShell-Skript übergeben. Beispielsweise akzeptiert Ihr Skript möglicherweise eine "Kraft", bei der das Skript in einem vorsichtigen Modus ausgeführt wird, wenn keine Kraft 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
 )

Innerhalb des Skripts würden Sie dann so damit arbeiten:

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

Wenn Sie das Skript aufrufen, setzen Sie den Parameter switch/flag wie folgt:

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

Wenn Sie explizit angeben möchten, dass das Flag nicht gesetzt ist, gibt es dafür eine spezielle Syntax

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

Links zu relevanter Microsoft-Dokumentation (für PowerShell 5.0; die Versionen 3.0 und 4.0 sind auch unter den Links verfügbar):

818
naivists