Informationen zu Skriptblöcken

Kurze Beschreibung

Definiert, was ein Skriptblock ist und erläutert, wie Skriptblöcke in der PowerShell-Programmiersprache verwendet werden.

Lange Beschreibung

In der PowerShell-Programmiersprache ist ein Skriptblock eine Sammlung von Anweisungen oder Ausdrücken, die als einzelne Einheit verwendet werden können. Ein Skriptblock kann Argumente und Rückgabewerte akzeptieren.

Syntactisch ist ein Skriptblock eine Anweisungsliste in Klammern, wie in der folgenden Syntax dargestellt:

{<statement list>}

Ein Skriptblock gibt die Ausgabe aller Befehle im Skriptblock zurück, entweder als einzelnes Objekt oder als Array.

Sie können auch einen Rückgabewert mithilfe des return Schlüsselworts angeben. Das return Schlüsselwort wirkt sich nicht auf die von Ihrem Skriptblock zurückgegebene Ausgabe aus oder unterdrücken sie. Das return Schlüsselwort beendet jedoch den Skriptblock in dieser Zeile. Weitere Informationen finden Sie unter about_Return.

Wie Funktionen kann ein Skriptblock Parameter enthalten. Verwenden Sie das Param-Schlüsselwort, um benannte Parameter zuzuweisen, wie in der folgenden Syntax dargestellt:

{
Param([type]$Parameter1 [,[type]$Parameter2])
<statement list>
}

Hinweis

In einem Skriptblock können Sie im Gegensatz zu einer Funktion keine Parameter außerhalb der Klammern angeben.

Wie Funktionen können Skriptblöcke die DynamicParam, BeginProcessund End Schlüsselwörter enthalten. Weitere Informationen finden Sie unter about_Functions und about_Functions_Advanced.

Verwenden von Skriptblöcken

Ein Skriptblock ist eine Instanz eines Microsoft-.NET Framework-TypsSystem.Management.Automation.ScriptBlock. Befehle können Skriptblockparameterwerte aufweisen. Das Cmdlet weist beispielsweise einen Parameter auf, der Invoke-Command einen ScriptBlock Skriptblockwert verwendet, wie in diesem Beispiel gezeigt:

Invoke-Command -ScriptBlock { Get-Process }
Handles  NPM(K)    PM(K)     WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----     ----- -----   ------     -- -----------
999          28    39100     45020   262    15.88   1844 communicator
721          28    32696     36536   222    20.84   4028 explorer
...

Invoke-Command Kann auch Skriptblöcke ausführen, die Parameterblöcke haben. Parameter werden mithilfe des ArgumentList-Parameters zugewiesen.

Invoke-Command -ScriptBlock { param($p1, $p2)
"p1: $p1"
"p2: $p2"
} -ArgumentList "First", "Second"
p1: First
p2: Second

Der Skriptblock im vorherigen Beispiel verwendet das param Schlüsselwort, um einen Parameter und $p2einen Parameter $p1 zu erstellen. Die Zeichenfolge "First" ist an den ersten Parameter gebunden () und "Second" ist an ($p1$p2) gebunden.

Weitere Informationen zum Verhalten von ArgumentList finden Sie unter about_Splatting.

Sie können Variablen verwenden, um Skriptblöcke zu speichern und auszuführen. Im folgenden Beispiel wird ein Skriptblock in einer Variable gespeichert und an Invoke-Commanddiese übergeben.

$a = { Get-Service BITS }
Invoke-Command -ScriptBlock $a
Status   Name               DisplayName
------   ----               -----------
Running  BITS               Background Intelligent Transfer Ser...

Der Aufrufoperator ist eine weitere Möglichkeit zum Ausführen von Skriptblöcken, die in einer Variable gespeichert sind. Wie Invoke-Commandfolgt, führt der Aufrufoperator den Skriptblock in einem untergeordneten Bereich aus. Der Anrufoperator kann ihnen die Verwendung von Parametern mit Skriptblöcken erleichtern.

$a ={ param($p1, $p2)
"p1: $p1"
"p2: $p2"
}
&$a -p2 "First" -p1 "Second"
p1: Second
p2: First

Sie können die Ausgabe aus Ihren Skriptblöcken mithilfe einer Zuordnung in einer Variable speichern.

PS>  $a = { 1 + 1}
PS>  $b = &$a
PS>  $b
2
PS>  $a = { 1 + 1}
PS>  $b = Invoke-Command $a
PS>  $b
2

Weitere Informationen zum Anrufoperator finden Sie unter about_Operators.

Verwenden von Verzögerungsbindungsskriptblöcken mit Parametern

Ein typierter Parameter, der Pipelineeingaben () oder (by Valueby PropertyName) akzeptiert, ermöglicht die Verwendung von Verzögerungsbindungsskriptblöcken im Parameter. Innerhalb des Skriptblocks "Verzögerungsbindung " können Sie mithilfe der Pipelinevariable $_auf das In-Objekt weitergeleitete Objekt verweisen.

# Renames config.log to old_config.log
dir config.log | Rename-Item -NewName {"old_" + $_.Name}

In komplexeren Cmdlets ermöglichen Verzögerungsbindungsskriptblöcken die Wiederverwenden eines In-Objekts, das andere Parameter auffüllt.

Hinweise zu Verzögerungsbindungsskriptblöcken als Parameter:

  • Sie müssen explizit alle Parameternamen angeben, die Sie mit Verzögerungsbindungsskriptblöcken verwenden.

  • Der Parameter darf nicht eingegeben werden, und der Parametertyp kann nicht sein [scriptblock] oder [object].

  • Sie erhalten einen Fehler, wenn Sie einen Verzögerungsbindungsskriptblock verwenden, ohne Pipelineeingaben bereitzustellen.

    Rename-Item -NewName {$_.Name + ".old"}
    
    Rename-Item : Cannot evaluate parameter 'NewName' because its argument is
    specified as a script block and there is no input. A script block cannot
    be evaluated without input.
    At line:1 char:23
    +  Rename-Item -NewName {$_.Name + ".old"}
    +                       ~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : MetadataError: (:) [Rename-Item],
          ParameterBindingException
        + FullyQualifiedErrorId : ScriptBlockArgumentNoInput,
          Microsoft.PowerShell.Commands.RenameItemCommand
    

Weitere Informationen

about_Functions

about_Functions_Advanced

about_Operators