608 Stimmen

Handhabung 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 deshalb weiß ich nicht, wie ich etwas so Einfaches wie das behandeln soll:

script.ps1 /n name /d domain

UND

script.ps1 /d domain /n name.

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

Natürlich ist das, was ich schon habe, nicht schön und sicher 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

1133voto

naivists Punkte 31588

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

Dann behandeln Sie sie in einem param Abschnitt (beachten Sie, dass dieser muss beginnt mit der ersten unkommentierten Zeile in Ihrem Skript).

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

 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 zu Variablen werden, die im Skriptbereich verfügbar sind.

In diesem Beispiel ist die $server erhält einen Standardwert, wenn das Skript ohne ihn aufgerufen wird, das Skript hält an, wenn Sie das -username und fragt nach einer Terminaleingabe, wenn -password weggelassen wird.

Aktualisieren: Sie können auch ein "Flag" (einen booleschen true/false-Parameter) an ein PowerShell-Skript übergeben. Ihr Skript kann beispielsweise ein "force" akzeptieren, wobei das Skript in einem vorsichtigeren Modus ausgeführt wird, wenn force nicht verwendet wird.

Das Schlüsselwort dafür lautet [switch] Parameter-Typ:

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

Innerhalb des Skripts würden Sie dann wie folgt vorgehen:

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

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

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

Wenn Sie ausdrücklich angeben wollen, dass das Kennzeichen nicht gesetzt ist, gibt es dafür eine spezielle Syntax

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

Links zur relevanten Microsoft-Dokumentation (für PowerShell 5.0; die Versionen 3.0 und 4.0 sind ebenfalls über die Links verfügbar):

82 Stimmen

Einer der großen Vorteile von PowerShell ist in der Tat, dass es eine einfach zu verwendende Standard-Parameter-Parsing-Infrastruktur bietet.

15 Stimmen

@naivists, von PowerShell 2.0 anstelle von [string]$username = $(throw "-username is required.") gibt es eine Syntax für obligatorische Parameter: [Parameter(Mandatory=$true)][string]$username . Hier finden Sie weitere Informationen über die Unterschiede zwischen diesen Techniken: blogs.technet.com/b/heyscriptingguy/archive/2011/05/22/

10 Stimmen

Achten Sie auf den Fehler, der auftritt, wenn kein Arg angegeben wird; Powershell übernimmt dann einfach jeden zusätzlichen Text aus der Befehlszeile: . \yourscript.ps1 -Server " serv " -password "mypass" typo Damit wird $username auf magische Weise 'typo' zugewiesen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X