PowerShell: Befehle= CMDlets, Aliase, externe Befehle, PSSnapis und Hilfe – Part 5
3.5 Befehle = CMDlets, Aliase, externe Befehle, PSSnapins
Die PowerShell kennt eine große Anzahl von internen Befehlen, sog. Cmdlets oder Command-lets. Verglichen mit den internen Befehlen der CMD Shell, handelt es sich um ein vielfaches (es gibt alleine 263 Cmdlets in PowerShell, in der CMD etwa 50 interne Befehle). Die Cmdlets folgen immer der Namenskonvention verb-noun. „Verb“ bezeichnet immer die Aktion und „Noun“ das Objekt, an dem diese Aktion durchgeführt wird. Obwohl die PowerShell lokalisiert werden kann, haben die Cmdlets immer die gleichen, englischen Bezeichnungen (zum Glück!!!). Die Allgemeine Befehlssyntax kann wie folgt dargestellt werden:
Befehlsname | Switchparameter | Parameter mit Argument | Positionsargument |
Command | -Parameter1 | -Parameter2 Arg1 | Arg2 |
Je nach Art des Befehls können einzelne Bestandteile der Syntax optional, gar nicht oder mehrfach vorhanden sein. Parameter1 ist ein sog. Switchparameter. Er braucht keine Argumente und steuert lediglich das Verhalten des Befehls (-recurese, -force, etc.). Parameter2 ist ein sog. Benannter Parameter. Er erfordert die Eingabe eines Arguments (benanntes Argument, siehe auch Kapitel 4.1). Arg2 wird ohne eines Parameters angegeben und nennt sich ein Positionsargument. Die Bedeutung eines Positionsarguments für den Befehl ergibt sich ausschließlich aus der Position, an der es eingegeben wird. Wenn Argumente Leerzeichen enthalten, müssen sie in Anführungszeichen eingeschlossen sein. Benannte Argumente können auch ohne den Parameternamen eingegeben werden, dann verhalten sie sich wie die Positionsargumente und die Reihenfolge muss eingehalten werden. Des Weiteren gibt es zwingende und optionale Parameter. Wenn ein optionaler Parameter nicht angegeben wird, wird für die Ausführung des Befehls ein Standardwert verwendet. Die Standardwerte für optionale Parameter sind immer in der Hilfe zum jeweiligen Cmdlet angegeben. Dort wird auch angegeben, welche Parameter Switchparameter sind und welche optional sind.
Alle Cmdlets unterstützen sog. Common Parameters. Im Einzelnen sind das folgende Parameter:
Parameter | Beschreibung | Werte |
Verbose | Zeigt detaillierte Informationen zur ausgeführten Aktion, wenn der Befehl das unterstützt. | $True, $False |
Debug | Zeigt Debug-Level Informationen zur ausgeführten Aktion, wenn der Befehl das unterstützt | $True, $False |
WarningAction | Legt fest, wie auf eine Warnung reagiert wird, welche von dem Cmdlet generiert wird | SilentlyContinue, Continue, Inquire, Stop |
WarningVariable | Speichert Warnungen, welche von einem Cmdlet generiert wurden, in einer Variablen.Mit einem vorangestellten Pluszeichen können die Warnungen an evtl. vorhandenen angehangen werden | [+]$varname |
ErrorAction | Legt fest, wie auf einen Fehler reagiert wird | SilentlyContinue, Continue, Inquire, Stop |
ErrorVariable | Analog zu WarnigVariable aber für Fehler | [+]$varname |
OutVariable | Legt die Größe eines Puffers fest, in dem Objekte gespeichert werden, bevor sie an die Pipeline geschickt werden | [+]$varname |
OutBuffer | Gibt voraussichtliche Effekte der ausgeführten Aktionen aus | Int32 |
WhatIf | Zeigt die Auswirkungen eines Befehls an ($True), ohne ihn wirklich auszuführen | $True, $False |
Confirm | Fordert eine Bestätigung vor dem Ausführen des Befehls an | $True, $False |
Tabelle 3 2: Common Parameters.
Die PowerShell bietet die Möglichkeit, alternative Namen (Aliase) für Cmdlets und andere Elemente zu definieren. Über 130 Aliase sind bereits in der PS definiert. Sie können die Arbeit mit der Shell denjenigen erleichtern, die bisher in anderen Umgebungen (CMD, Unix, etc.) zuhause waren. So kann z.B. „dir“, „type“, „cat“ und „tee“ direkt in der PowerShell verwendet werden. Dahinter verbergen sich die Cmdlets Get-ChildItem, Get-Content und Tee-Object. Mit Hilfe des Cmdlets Get-Alias können alle definierten Aliase aufgelistet werden. Mit dem Cmdlet Set-Alias können weitere Aliase dem System hinzugefügt werden. Auf diese Weise können jedoch nur Aliase erzeugt werden, welche die Lebensdauer einer PS Sitzung haben. Dauerhafte Definition kann z.B. über PowerShell Profile realisiert werden.
Hier kann eigentlich die gleiche Empfehlung ausgesprochen werden, wie bereits bei dem Thema PowerShell Profile. Aus unserer Sicht ist es viel sinnvoller, die nativen PowerShell Befehle zu lernen und zu verwenden, da die selbst definierten Aliase und andere Anpassungen nicht immer in jede beliebige Umgebung mitgenommen werden können
Die PowerShell kann genauso, wie auch die CMD, alle externe Befehle ausführen. Mit externen Befehlen sind hier alle ausführbaren Dateien eines Systems gemeint. Das darf jedoch nicht mit den internen Befehlen der CMD Shell verwechselt werden, die letzteren kann nur die CMD selbst interpretieren und ausführen. Hin und wieder können diesbezüglich Überraschungen erlebt werden:
1
2
3
4
5
6
|
4. Echo off 5. off 6. Get-Alias Echo CommandType Name Definition ----------- ---- ---------- Alias echo Write-Output |
Der Befehlssatz der PowerShell kann durch sog. PSSnapins erweitert werden. Snapins beinhalten kompilierten .Net Code und liegen meistens in Form von DLLs vor. Die Snapins werden mit dem Cmdlet Add-PSSnapin geladen. Anschließend stehen im Snapin definierten Cmdlets samt den dazugehörigen Hilfethemen zur Verfügung. Ein Beispiel für ein Snapin sind die Citrix.XenApp.Commands, welche später in diesem Dokument behandelt werden (Kapitel 7.5). Neben den PSSnapins können auch sogenannte Module zur Erweiterung des Befehlssatzes verwendet werden. Den Modulen ist ein eigenes Kapitel gewidmet (8) daher wir hier nicht näher darauf eingegangen.
3.6 Hilfe!!!
Davon hat die PowerShell reichlich! Es müsste sogar möglich sein, das Scripting mit PowerShell alleine aus der Hilfe zu lernen. Das Cmdlet Get-Help, welches wir bereits gesehen haben, liefert Informationen zu jedem Cmdlet, nach Wunsch in unterschiedlicher Detailtiefe. Darüber hinaus gibt es viele allgemeine Hilfethemen zu PowerShell Konzepten und bestimmten Sprachelementen. Die sog. „about_Themen“ können mit folgendem Befehl aufgelistet werden:
1
|
Get-Help about |
Fast 90 Einträge werden zurückgeliefert. Die Anzeige der einzelnen Themen erfolgt durch die Übergabe der „about_Namen“:
1
|
Get-Help about_pssession_details |
Ab der Version 2.0 der PS kann das Cmdlet Get-Help auch innerhalb der Hilfethemen suchen. Als Ergebnis werden alle Hilfethemen ausgegeben, in denen der Suchbegriff behandelt wird:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
1. Get-Help Object Name Category Synopsis ---- -------- -------- ForEach-Object Cmdlet Performs an operation against each… Where-Object Cmdlet Creates a filter that controls whi… Register-ObjectEvent Cmdlet Subscribes to the events that are… Compare-Object Cmdlet Compares two sets of objects. … Measure-Object Cmdlet Calculates the numeric properties… Tee-Object Cmdlet Saves command output in a file or… New-Object Cmdlet Creates an instance of a Microsoft… Select-Object Cmdlet Selects specified properties of an… Group-Object Cmdlet Groups objects that contain the sa… Sort-Object Cmdlet Sorts objects by property values… Get-WmiObject Cmdlet Gets instances of Windows Manageme… Remove-WmiObject Cmdlet Deletes an instance of an existing… about_objects HelpFile Provides essential information abo… |
Bei der Anzeige der Hilfe zu bestimmten Cmdlets kann auch der Informationsgrad bestimmt werden. Die Switchparameter -detailed, -full und -examples geben jeweils Teile oder den gesamten Hilfetext aus.
Get-Help kann auch erkennen, ob ein Snapin geladen ist und sucht entsprechend in den Hilfethemen des Snapins. Die PowerShell 2.0 hat auch die Syntax für Funktionen und Skripte (siehe Kapitel 4) erheblich erweitert. Nun ist es möglich, Hilfethemen in Funktionen, Modulen und Skripten zu platzieren. Dann ist Get-Help auch imstande, diese Hilfethemen in der gleichen Art und Weise auszugeben, wie auch für Cmdlets.