Windows PowerShell: Definieren von Parametern

Es gibt einfache und komplizierte Wege zur Bestimmung von Parametern in Windows PowerShell, und beide Wege haben ihre Vorteile.

Don Jones

Oft schreiben Sie ein Skript oder eine Funktion, die eine Art der Eingabe akzeptieren muss. Dies könnte einen Computernamen, einen Dateipfad oder etwas ähnliches. Sie können Windows PowerShell zu erwarten, dass diese Parameter, sammeln Sie sie von der Befehlszeile aus und setzen Sie ihre Werte in Variablen in Ihrem Skript oder Funktion erklären. Das macht Umgang mit Input, einfach und effizient.

Sie müssen nur wissen, wie Sie Ihre Parameter deklarieren. Einfachsten Mitteln tun ist also die Param-Block:

Param(
  [string]$computerName,
  [string]$filePath
)

Sie haben nicht zu brechen, die in separaten Zeilen wie ich getan habe. Es ist legal, die alle zusammen auf einer einzigen Zeile ausführen. Ich bevorzuge es zur besseren Lesbarkeit, aber brechen. Als die ersten Zeilen des Codes in einer Skriptdatei oder innerhalb einer Funktion verwendet, ist Windows PowerShell liest dies und hin zur Registerkarte-vollständigen Parameternamen verwendet wird, wenn jemand das Skript oder die Funktion ausgeführt wird. Ich habe darauf achten, Parameternamen verwenden: Sie sind – Computername und –filePath hier. Diese sind ähnlich wie die, die andere Windows PowerShell-Cmdlets für diese Art von Informationen zu nutzen. Auf diese Weise meine Parameter entsprechen dem was bereits in der Shell ist.

Wenn ich dies in ein Skript namens Get-Something.ps1, würde ich die Parameter wie folgt verwenden:

./Get-Something –computerName SERVER1 –filePath C:\Whatever 

Ich konnte auch die Parameternamen abgeschnitten. Dies ermöglicht mir weniger Zeichen zu geben und sie noch arbeiten:

./Get-Something –comp SERVER1 –file C:\Whatever

Ich konnte sogar die Namen ganz weglassen. Windows PowerShell wird automatisch und positionsbezogen Werte akzeptieren. Hier muss ich darauf achten, Werte in der gleichen Reihenfolge angeben, in der die Parameter in der Datei aufgelistet sind:

./Get-Something SERVER1 C:\Whatever

Natürlich wird mithilfe von Parameternamen, der Befehl ein bisschen einfacher für eine Person herauszufinden. Ich bekomme dann den Luxus, setzen die Parameter in beliebiger Reihenfolge, was, die ich will:

./Get-Something –filePath C:\Whatever –computerName SERVER1

Windows PowerShell bietet auch eine komplexere Möglichkeit Parameter zu deklarieren. Diese mehr vollwertige Syntax können Sie die Parameter als obligatorisch definieren, geben Sie eine Position (wenn Sie dies nicht tun dann der Parameter nur Namen verwendet werden kann) und vieles mehr. Diese erweiterten Syntax ist auch zulässig in Skripts und Funktionen:

[CmdletBinding()]
Param(
  [Parameter(Mandatory=$True,Position=1)]
   [string]$computerName,
	
   [Parameter(Mandatory=$True)]
   [string]$filePath
)

Wieder alles zusammen in einer einzigen Zeile ausführen können, aber es brechen macht es ein bisschen leichter zu lesen. Ich habe meine Parameter ein [Parameter()] gegeben Dekorateur, und sie beide als Pflichtfelder definiert.

Wenn jemand versucht, mein Skript auszuführen und eine oder beide dieser Parameter vergisst, wird die Shell automatisch abgefragt. Es ist keine zusätzliche Arbeit für meinen Teil musste passieren, dass zu machen. Ich habe auch – Computername als in der ersten Position definiert, aber –filePath muss namentlich bereitgestellt werden.

Es gibt einige andere Vorteile zur Verwendung der Direktive [CmdletBinding()]. Zum einen sorgt es für mein Skript oder Funktion haben alle Windows PowerShell allgemeinen Parameter, einschließlich verbose und Indexzahl. Nun, ich kann in meinem Skript oder die Funktion Write-Verbose und Write-Debug verwenden und die Ausgabe wird automatisch unterdrückt.

Führen Sie das Skript oder die Funktion mit Verbose oder Indexzahl und Write-Verbose oder Write-Debug (jeweils) werden auf magische Weise aktiviert. Das ist eine gute Möglichkeit, detaillierte Fortschrittsinformationen (Write-Verbose) zu produzieren oder fügen Sie Debuggen Haltepunkte (Write-Debug) in Ihren Skripts.

Wie sie derzeit geschrieben sind, werden beide Parameter nur einen einzelnen Wert akzeptieren. Deklarieren sie als [Zeichenfolge []] ließ sie eine ganze Sammlung von Werten annehmen. Sie würde dies dann aufzählen, mithilfe einer Foreach-Schleife, so dass Sie mit einem Wert zu einem Zeitpunkt arbeiten konnte.

Ein weiteres nettes Parametertyp ist [wechseln]:

Param([switch]$DoSomething)

Nun, ich kann mein Skript oder Funktion laufen, ohne –DoSomething-Parameter und intern DoSomething die Variable $ $False. Wenn ich das Skript mit dem –DoSomething-Parameter ausführen, ruft $DoSomething auf $True festgelegt. Es gibt keine Notwendigkeit, einen Wert für den Parameter übergeben. Windows PowerShell setzt sie auf $ true fest, wenn Sie es einfach aufnehmen. Dies ist, wie Switch-Parameter, wie z. B. den –recurse-Parameter von Get-ChildItem betrieben.

Denken Sie daran, dass jeder Parameter eine eigene Entität, und es ist von den nächsten Parameter durch ein Komma getrennt. Sie werden bemerken, dass in einem vorherigen Beispiel:

[CmdletBinding()]
Param(
  [Parameter(Mandatory=$True,Position=1)]
   [string]$computerName,
	
   [Parameter(Mandatory=$True)]
   [string]$filePath
)

Es scheint der gesamten – Computername-Parameter, einschließlich seine [Parameter()]-Dekorateur, vor dem Komma. Dem Komma anzeigt, ich bin fertig erklären den ersten Parameter, und ich bin bereit, zur nächsten übergehen. Alles, was mit –filePath folgt das Komma. Wenn ich einen dritten Parameter benötigt, würde ich ein weiteres Komma setzen:

[CmdletBinding()]
Param(
  [Parameter(Mandatory=$True,Position=1)]
   [string]$computerName,
	
   [Parameter(Mandatory=$True)]
   [string]$filePath,

   [switch]$DoSomething
)

All das in der Param()-Block enthalten ist. Beachten Sie, dass Sie nicht das [Parameter()]-Decorator auf jeden Parameter zu verwenden. Nur benutze es auf diejenigen, wo Sie etwas, wie der Parameter zwingend, deklarieren müssen akzeptieren Pipelineeingaben, wird an einer bestimmten Position und so weiter. Führen Sie Hilfe About_functions_advanced_parameters in Windows PowerShell Weitere Informationen auf andere Attribute, die Sie auf diese Weise deklarieren können.

Schreiben von Funktionen und Skripts, die Eingaben nur über Parameter akzeptieren, ist eine bewährte Methode. Es macht sie mehr eigenständig und Dokument leichter und mehr im Einklang mit den Weg den Rest der Schale Werke.

Don Jones

Don Jones ist ein Microsoft MVP Award Empfänger und Autor der "Lernen Sie Windows PowerShell in ein Monat der Mittagessen" (Manning Publications, 2011), ein Buch soll helfen, jeder Administrator mit Windows PowerShell zustande. Jones bietet öffentlichen und vor-Ort-Training an Windows PowerShell. Sie erreichen ihn über ConcentratedTech.com oder bit.ly/AskDon.

Verwandte Inhalte