Skriptblöcke
Powershell hat eigentlich 2 Funktionseinheiten – Cmdlets und Skriptblöcke. Cmdlets sind eigenständige Kommandos, die man direkt aufrufen kann. Sobald man mehrere Kommandos in geschweiften Klammern zusammenfasst, hat man einen Skriptblock. Ein Skriptblock ist per Definition erst einmal ein Satz von Kommandos, die nacheinander ausgeführt werden. Außerdem legt der Skriptblock den Gültigkeitsbereich aller Variablen fest, die in ihm deklariert werden, denn sobald ein Skriptblock abgearbeitet ist, werden auch alle in ihm deklarierten Variablen wieder gelöscht.
Skriptblöcke sind in Powershell enorm wichtig, denn es wird überall auf sie zurück gegriffen – in Schleifen, in bedingten Ausführen, im Validierungsattribut ValidateScript, sogar ein Powershell-Skript ist implizit ein Skriptblock, nur dass die Grenzen des Skriptblocks in diesem Fall schon durch die Datei vorgegeben sind und nicht mehr explizit in das Skript geschrieben werden müssen.
Wenn Sie einen Skriptblock erstellen wollen, fassen Sie Ihren Code einfach in geschweifte Klammern ein, schon haben Sie einen Skriptblock. Allerdings wird Ihnen das nicht viel helfen, denn ein Skriptblock ist allein nicht lauffähig, sondern benötigt immer einen "Starter".
{
Get-Command
}
Wenn Sie diesen Code ausführen, wird nicht get-command ausgeführt, sondern Powershell schreibt Ihnen den Inhalt des Skriptblocks als Text in die Konsole. Wenn Sie den Skriptblock starten möchten, können Sie das Cmdlet Invoke-Command oderdas kaufmännische Und (Ampersand) vor den Skriptblock schreiben:
Invoke-Command -Scriptblock { Get-Command } # oder
& { Get-Command }
& ist ein sogenannter Ausführungsoperator. Schreibt man & vor einen String, wird der String nicht ausgegeben, sondern stattdessen als Kommando interpretiert und ausgeführt:
& 'Get-Command'
Sie können einen Skriptblock auch in einer Variablen speichern. Starten Sie die Variable, wird aber wieder nur der Code des Blocks ausgegeben, ohne ihn zu starten. Sie können wieder den Ausführungsoperator verwenden, um den Block zu starten.
$Script = { Get-Command } & $Script