PowerShell Skripte erstellen: Einführung in die 4 wichtigsten Cmdlets
PowerShell bietet mit Cmdlets eine mächtige Sprache zur Automatisierung. Raúl B. Heiduk führt dich in die vier wichtigsten Cmdlets ein und zeigt, wie du Routineaufgaben automatisierst.
Was sind Cmdlets?
PowerShell verfügt über zahlreiche eingebaute Befehle, die sogenannten Cmdlets (sprich: Commandlets). Ein Cmdlet besteht immer aus einem Verb, einem Substantiv (Singular) und einer Liste von Parametern. Diese Syntax ist konsistent, d.h. wenn du die Grundlagen verinnerlicht hast, verstehst du das Framework und kannst Skripte in PowerShell erstellen.
Selbst komplexe Skripte schreibst du schnell und mühelos, denn die Tabulatortaste auf deiner Tastatur dient als «magischer Helfer»: Mit einem Klick auf die Taste schlägt PowerShell bereits Befehle vor, wenn du diese noch nicht geschrieben hast.
PowerShell erkennt auch DOS-Befehle, was DOS-Affine zunächst freuen dürfte. Aber: Diese liefern reinen Text, den man zwar lesen, aber nicht verarbeiten kann.
Anders die Cmdlets: sie liefern keinen reinen Text, sondern Objekte. Auf deren verschiedene Eigenschaften (Grösse, Name, letztes Änderungsdatum) kann man nicht nur zugreifen, sondern auch verschiedene Methoden (öffnen, schliessen, kopieren, löschen) anwenden. Insofern bieten die PowerShell-Befehle einen grossen Mehrwert gegenüber den DOS-Befehlen.
Die 4+1 wichtigsten Cmdlets
PowerShell bietet mehr als 100 grundlegende Cmdlets, und du kannst deine eigenen Cmdlets schreiben und mit anderen teilen. Um Skripts in PowerShell erstellen zu können, solltest du die folgenden vier Cmdlets kennen.
1 «get-member»
Zum Abrufen der Eigenschaften von Objekten ist «get-member» das richtige Cmdlet. Du musst dieses Cmdlet mit dem Befehl kombinieren, der das gewünschte Objekt anfordert, zum Beispiel:
get-date | get-member
Der senkrechte Strich bedeutet in diesem Fall «weiterleiten». Mit der Ausführung dieses Skripts erhältst du alle Eigenschaften, die dem Objekt Datum zugeordnet sind.
2 «get-command»
Mit dem Cmdlet «get-command» rufst du alle auf dem Computer installierten Befehle ab. Verwende Wildcards, um die Suche einzugrenzen, zum Beispiel um nur Befehle zu suchen, die mit dem Buchstaben i beginnen:
get-command *i
3 +1 «get-help» und «update help»
Wenn du Hilfe zu einem Cmdlet benötigst, forderst du diese mit «get-help» an. Beachte jedoch, dass die Hilfe beim Auspacken des Betriebssystems noch nicht installiert ist. Daher benötigst du zunächst den +1-Kommando «update help». Wenn du die Hilfe für einen Server benötigst, der nicht mit dem Internet verbunden ist, speicherst du die Hilfe lokal. Rufe dann die Hilfe für ein Cmdlet auf, zum Beispiel:
Get help | get-date
Die angezeigte Hilfe ist nicht immer verständlich, daher ist es hilfreich, Beispiele anzufordern:
Get help | get-date - Beispiele
4 select-object *
Mit dem Cmdlet «select-object» forderst du die Eigenschaftswerte eines ausgewählten Objekts an. Damit schränkst du deine Suche ein. Du kannst beispielsweise nach Eigenschaftswerten suchen, die mit dem Buchstaben d beginnen und mit e enden:
get-date | select-object d*e
So erstellst du Automatismen mit Cmdlets
Mit den Cmdlets kannst du nun auf einfache Weise Automatismen für bestimmte Aufgaben erstellen. Beispielsweise kannst du alle Dienste automatisch starten lassen, deren Start-Typ auf «automatisch» gesetzt ist, die aber noch nicht gestartet wurden.
Hierzu suchst du zunächst nach der benötigten Eigenschaft:
get-service | get-member
In der angezeigten Liste siehst du, dass die benötigte Eigenschaft «StartType» heisst. Suche nun nach der richtigen Bezeichnung für den Status «automatisch»:
get-service | select-object
In den Suchergebnissen findest du schnell den Status «automatisch». Nun listet es alle Dienste auf, bei denen der Start-Typ auf «automatisch» steht. Dazu benötigst du das gängige Cmdlet «where-object» und eine zugegebenermassen nicht ganz einfache Syntax:
get-service | where-object {$_.StartType -eq «automatic»}
Mit diesem Befehl (eq steht für equal, also gleich) erhältst du alle Dienste, deren Start-Typ auf «automatisch» steht. Du musst diese jedoch weiter einschränken, da du an denen interessiert bist, die nicht gestartet werden, also «not equal running» sind.
get-service | where-object {$_.StartType -eq «automatic» _and $_.Status _ne «running»}
Mit diesem Skript erhältst du alle Dienste, die den Start-Typ «automatisch» haben, aber nicht gestartet sind. Verwende das Cmdlet «start-service», um dieses Problem zu beheben:
get-service | where-object {$_.StartType -eq «automatic» _and $_.Status _ne «running»} | start-service
Mit dieser einen Zeile hast du das bestehende Problem gelöst!
Erstelle ein benutzerdefiniertes Cmdlets
Du kannst nun dein eigenes Cmdlet aus dem Skript erstellen, das du gerade geschrieben hast. Kopiere dazu das Skript in den Editor. Gib vor dem Befehl an, dass es sich um eine neue Funktion handelt, und gib ihr einen aussagekräftigen Namen:
function Start-AllStoppedAutoService
Speichere diesen Text z.B. unter dem Namen «MyModules-psm1». Der Speicherort ist der, der für PowerShell-Module vorgesehen ist (z.B. C: Windows: System 32: Windows PowerShell: v.1.0: Modules).
Hier legst du ein neues Verzeichnis für deine Module an. Voraussetzung ist, dass der Name des Verzeichnisses dem Namen der darin enthaltenen psm1-Datei entspricht, in unserem Fall also «MyModules».
Damit hast du die PowerShell um ein Modul erweitert. Dieses neue Skript ist nun in deiner Liste aller Cmdlets enthalten.
Lese auch: Warum alle System-Admins PowerShell lernen sollten
.