BLOG
Wissenstransfer von IT-Spezialisten
| |

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:

BefehlsnameSwitchparameterParameter mit ArgumentPositionsargument
Command-Parameter1-Parameter2 Arg1Arg2

 

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:

 

ParameterBeschreibungWerte
VerboseZeigt detaillierte Informationen zur ausgeführten Aktion, wenn der Befehl das unterstützt.$True, $False
DebugZeigt Debug-Level Informationen zur ausgeführten Aktion, wenn der Befehl das unterstützt$True, $False
WarningActionLegt fest, wie auf eine Warnung reagiert wird, welche von dem Cmdlet generiert wirdSilentlyContinue, Continue, Inquire, Stop
WarningVariableSpeichert Warnungen, welche von einem Cmdlet generiert wurden, in einer Variablen.Mit einem vorangestellten Pluszeichen können die Warnungen an evtl. vorhandenen angehangen werden[+]$varname
ErrorActionLegt fest, wie auf einen Fehler reagiert wirdSilentlyContinue, Continue, Inquire, Stop
ErrorVariableAnalog zu WarnigVariable aber für Fehler[+]$varname
OutVariableLegt die Größe eines Puffers fest, in dem Objekte gespeichert werden, bevor sie an die Pipeline  geschickt werden[+]$varname
OutBufferGibt voraussichtliche Effekte der ausgeführten Aktionen ausInt32
WhatIfZeigt die Auswirkungen eines Befehls an ($True), ohne ihn wirklich auszuführen$True, $False
ConfirmFordert 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.