Grundlegendes zu Windows PowerShell-Funktionsparametern

Der PowerShell-Parameter ist eine grundlegende Komponente jedes Skripts. Mit einem Parameter können Entwickler Skriptbenutzern ermöglichen, zur Laufzeit Eingaben bereitzustellen. Wenn sich das Verhalten eines PowerShell-Skripts in irgendeiner Weise ändern muss, bietet ein Parameter die Möglichkeit, dies zu tun, ohne den zugrunde liegenden Code zu ändern.

Mithilfe von Parametern können Entwickler wiederverwendbare PowerShell-Skripts erstellen, die bei korrekter Erstellung nur wenig Code-Wartung und Erweiterbarkeit erfordern.

In diesem Artikel erfahren Sie, wie Sie Skripts und PowerShell-Funktionsparameter erstellen, wie Sie sie verwenden und welche bewährten Methoden zum Erstellen von Parametern verwendet werden.

Parameter definieren

Parameter können für Skripte und Funktionen erstellt werden und sind immer in einem Parameterblock eingeschlossen, der mit dem definiert ist param Schlüsselwort, gefolgt vom Öffnen und Schließen von Klammern.
param ()
Innerhalb dieses Parameterblocks befinden sich ein oder mehrere Parameter, die – im Grunde genommen – durch eine einzelne Variable definiert sind, wie unten gezeigt.
param (
$ Parameter1
)
Um jedoch sicherzustellen, dass der Parameter nur die Art der Eingabe akzeptiert, die Sie benötigen, und in Zukunft andere Funktionen unterstützt, schreiben Best Practices die Zuweisung von a vor Art zum Parameter und einschließlich a [Parameter()] Block. Im folgenden Beispiel sehen Sie einen Parameter, der nur Objekte vom Typ akzeptiert Zeichenfolge.

param(
    [Parameter()]
    [string]$Parameter1
)

Zusätzliche Parameter können auf die gleiche Weise hinzugefügt werden, indem sie durch ein Komma getrennt werden (siehe Beispiel unten).

param(
    [Parameter()]
    [string]$Parameter1,    [Parameter()]
    [string]$Parameter2
) Write-Host "Parameter 1 value is $Parameter1"
Write-Host "Parameter 2 value is $Parameter2"

Benannte Parameter

Eine Möglichkeit, PowerShell-Funktionsparameter in einem Skript zu verwenden, ist der Parametername. Diese Methode wird aufgerufen benannte Parameter. Verwenden Sie beim Aufrufen eines Skripts oder einer Funktion über benannte Parameter den gesamten Namen des Parameters.
Beispielsweise wird der obige Beispielparameterblock möglicherweise in einem aufgerufenen PowerShell-Skript gespeichert foo.ps1. Wenn Sie Werte für die angeben müssen Parameter1 und Parameter2 Wenn Sie benannte Parameter verwenden, tun Sie dies auf die folgende Weise. Beachten Sie, dass der vollständige Name jedes Parameters verwendet wird, gefolgt von dem Wert, der an ihn übergeben wird.

./foo.ps1 -Parameter1 'somevalue' -Parameter2 'someothervalue'

Wenn Sie dieses Skript ausführen, wird eine ähnliche Ausgabe wie die folgende angezeigt, bei der jede Parametervariable durch den bei übergebenen Wert ersetzt wird Laufzeit.

Parameter1 irgendein Wert

Positionsparameter

Eine andere Möglichkeit, Parameter zu verwenden, besteht darin, Werte an zu übergeben Position eher als von Name. Wenn Sie einen Parameterwert nach Position übergeben, wird der Name des Parameters nicht verwendet. PowerShell vergleicht stattdessen die Werte für jeden Parameter mit der Position, die es im Befehl hält.
Verwenden Sie das vorherige Beispiel des foo.ps1 Skript, die Werte für Parameter1 und Parameter2 kann mit den folgenden Positionsparametern übergeben werden. Die Parameternamen werden nicht verwendet. Stattdessen weiß PowerShell Bescheid Parameter1 wurde oben definiert Parameter2 im Skript und stimmt die Werte automatisch in der richtigen Reihenfolge ab.

./foo.ps1 'somevalue' 'someothervalue'

Das Ausführen dieses Skripts mit Positionsparametern führt zum gleichen Ausgabeergebnis.

Parameter2 ein anderer Wert

Im obigen Beispiel sind sowohl die Parameter1 und Parameter2 wurden als Zeichenfolgentypen definiert, aber dies ist nicht der einzige Typ, den Sie verwenden können. Sie können einen beliebigen Typ in der .NET-Klassenbibliothek verwenden.

Parameter wechseln

Ein weiterer Parameter, den Sie verwenden können, ist der Schalter Parameter. Dieser Parameter wird für binär oder verwendet Boolescher Wert Werte für “Ein” oder “Aus”. Es ist mit dem definiert [switch] Art.

Wenn Sie das Beispiel weiterhin mit zwei Parametern verwenden, fügen Sie einen Schalterparameter hinzu. Vielleicht möchten Sie die Ausgabe von anzeigen Parameter2 nur wenn explizit angegeben. Um den Wert von sicherzustellen Parameter2 wird angezeigt, fügen Sie einen Schalterparameter mit dem Namen hinzu DisplayParameter2Value, Wie nachfolgend dargestellt.
Sobald der switch-Parameter vorhanden ist, können Sie eine logische Entscheidung in Ihrem Code treffen, indem Sie ein if / then-Konstrukt einfügen, um nur Code auszuführen, wenn der switch-Parameter vorhanden ist ist anwesend.

param(
    [Parameter()]
    [string]$Parameter1,    [Parameter()]
    [string]$Parameter2,     [Parameter()]
    [switch]$DisplayParameter2Value
) Write-Host "Parameter 1 value is $Parameter1"
if ($DisplayParameter2Value.IsPresent) {
    Write-Host "Parameter 2 value is $Parameter2"
}

Sie haben jetzt die Möglichkeit, den Wert von anzuzeigen Parameter2 – oder nicht – wie Sie unten sehen können.

Wert von Parameter 2 anzeigen

Splatting

Das obige Beispiel enthält nur drei Parameter. Das Übergeben von Werten an diese Parameter erstreckt sich nicht zu weit nach rechts. Aber was ist, wenn Sie 10 oder mehr Parameter haben? Und was ist, wenn diese Parameter lange Namen haben? In diesem Fall müssen Sie einige Splatting durchführen.
Splatting ist ein Begriff, der das Einrichten von Parametern für ein Skript oder eine Funktion beschreibt Vor Sie führen einen Befehl aus. In diesem Artikel haben Sie zur Laufzeit Werte definiert und an Parameter übergeben. Dies kann problematisch sein, wenn Sie eine Reihe von Parametern haben, die ungefähr so ​​aussehen:

param(
    [Parameter()]
    [string]$Parameter1,    [Parameter()]
    [string]$Parameter2,     [Parameter()]
    [switch]$DisplayParameter2Value,     [Parameter()]
    [string]$Parameter3,     [Parameter()]
    [string]$Parameter4,     [Parameter()]
    [string]$Parameter5,     [Parameter()]
    [string]$Parameter6,     [Parameter()]
    [string]$Parameter7
) Write-Host "Parameter 1 value is $Parameter1"
if ($DisplayParameter2Value.IsPresent) {
    Write-Host "Parameter 2 value is $Parameter2"
}
Write-Host "Parameter 3 value is $Parameter3"
Write-Host "Parameter 4 value is $Parameter4"
Write-Host "Parameter 5 value is $Parameter5"
Write-Host "Parameter 6 value is $Parameter6"
Write-Host "Parameter 7 value is $Parameter7"

Wenn Sie in diesem neuen Beispiel Werte über benannte Parameter übergeben müssen, würde der Befehl weit über eine angemessene Länge nach rechts hinausgehen.

./foo.ps1 -Parameter1 'somevalue' -Parameter2 'someothervalue' -Parameter3 'somevalue' -Parameter4 'somevalue' -Parameter5 'somevalue' -Parameter6 'somevalue' -Parameter7 'somevalue' -DisplayParameter2Value

Anstatt nach rechts zu scrollen, können Sie die Parameterwerte in einem separaten Schritt mithilfe einer Hashtabelle definieren, wie unten gezeigt. Jeder Parameterwert kann gut ausgerichtet werden und es ist viel einfacher zu sehen, welche Parameter verwendet werden.
Sobald die Hashtabelle erstellt wurde, können Sie alle Parameter an das Skript oder den Befehl übergeben, indem Sie einfach den Namen der Hashtabelle angeben, der ein vorangestellt ist @ Charakter.

$parameters = @{
    Parameter1             = 'somevalue'
    Parameter2             = 'someothervalue'
    Parameter3             = 'somevalue'
    Parameter4             = 'somevalue'
    Parameter5             = 'somevalue'
    Parameter6             = 'somevalue'
    Parameter7             = 'somevalue'
    DisplayParameter2Value = $true
}PS> ./foo.ps1 @parameters

PowerShell-Parameterattribute

Erinnern Sie sich an den Abschnitt “Definieren von Parametern”, den ich oben erwähnt habe [Parameter()] Konstrukt war optional, aber empfohlen? Dieser Abschnitt ist einer dieser Gründe.
Es gibt viele Möglichkeiten, das Parameterverhalten zu ändern, die als Parameterattribute bezeichnet werden. Sie können beispielsweise die Verwendung eines bestimmten Parameters erzwingen, sicherstellen, dass die an einen Parameter übergebenen Werte Teil eines bestimmten Satzes sind und mit einem regulären Ausdruck übereinstimmen. Microsoft bietet eine umfassende Liste von erweiterten Parametern, aber um zu beginnen, müssen Sie nur die häufigsten kennen.

Obligatorische Parameter

Es ist üblich, einen oder mehrere PowerShell-Funktionsparameter zu haben Muss wird verwendet, wenn ein Skript ausgeführt wird. In PowerShell-speak wird diese Parametererzwingung als a bezeichnet verpflichtend Parameter. Wenn Sie einen Parameter obligatorisch machen, kann das Skript oder die Funktion ohne ihn nicht ausgeführt werden. Selbst wenn Sie vergessen, den Parameter zu verwenden, werden Sie von PowerShell interaktiv zur Eingabe des Werts aufgefordert.
Betrachten Sie das Beispiel für den Schalterparameter. Der einzige Unterschied ist der folgende Parameter1 wurde durch Verwendung des Schlüsselworts in der obligatorisch gemacht [Parameter()] bauen.

param(
    [Parameter(Mandatory)]
    [string]$Parameter1,    [Parameter()]
    [string]$Parameter2,     [Parameter()]
    [switch]$DisplayParameter2Value
) Write-Host "Parameter 1 value is $Parameter1"
if ($DisplayParameter2Value.IsPresent) {
    Write-Host "Parameter 2 value is $Parameter2"
}

Vor dem Zuweisen der Parameter1 Um obligatorisch zu sein, hätte dieses Skript problemlos so ausgeführt werden können. Der Wert von Parameter1 wäre einfach leer.

./foo.ps1 -Parameter2 someothervalue

Sie können sehen, was passiert, wenn der Parameter unten obligatorisch gemacht wird. PowerShell lässt die Ausführung des Skripts nicht zu und fordert Sie zur Eingabe eines Werts auf.

Obligatorischer Parameter

Parametervalidierung

Stellen Sie schließlich sicher, dass die an die Parameter übergebenen Werte genau den Erwartungen entsprechen. Es wird empfohlen, das Potenzial von jemandem zu begrenzen Übergabe eines unerwarteten Wertes zu einem Parameter. Sie haben verschiedene Optionen zur Parameterüberprüfung zur Verfügung, um die in Parametern verwendeten Werte zu begrenzen. Eine vollständige Liste finden Sie in der Microsoft-Dokumentation unter Erweiterte Parameter.
Vielleicht weißt du das Parameter1 sollte immer nur einer von zwei Werten sein: foo und Bar. Sie möchten sicherstellen, dass der Wert von Parameter1 wird niemals etwas anderes als diese Werte sein. In diesem Fall können Sie ein Parametervalidierungsattribut namens verwenden ValidateSet.
Alle Parametervalidierungsattribute werden wie unten gezeigt über dem Parameternamen definiert. In diesem Fall, ValidateSet wurde zugewiesen Parameter1. Dieses Parametervalidierungsattribut akzeptiert ein Array von Werten. Im folgenden Beispiel ist das so ‘foo’, ‘bar’.

param(
    [Parameter(Mandatory,)]
    [ValidateSet('foo','bar')]
    [string]$Parameter1,    [Parameter()]
    [string]$Parameter2,     [Parameter()]
    [switch]$DisplayParameter2Value
) Write-Host "Parameter 1 value is $Parameter1"
if ($DisplayParameter2Value.IsPresent) {
    Write-Host "Parameter 2 value is $Parameter2"
}

Wenn Sie versuchen würden, einen anderen Wert als zu übergeben foo oder Bar zu Parameter1, Sie würden eine Fehlermeldung wie folgt erhalten:

Parameter1 Wertfehler

Parametervalidierungsattribute sind eine großartige Möglichkeit, die Verwendbarkeit einzuschränken.

Similar Posts

Leave a Reply