Historisch gesehen sind die Kommandozeilen-Tools in Unix-Systemen besser entwickelt als in Windows, jedoch hat sich mit dem neuen Ansatz die Situation geändert.
Windows PowerShell ermöglicht Systemadministratoren die Automatisierung der meisten Routineaufgaben. Damit lassen sich Einstellungen ändern, Dienste starten und stoppen sowie Wartungsarbeiten an den meisten installierten Anwendungen durchführen. Das blaue Fenster als weiteren Befehlsinterpreter zu betrachten, wäre irreführend. Dieser Ansatz spiegelt nicht die Innovationskraft wider, die Microsoft bietet. Tatsächlich sind die Möglichkeiten von Windows PowerShell viel umfangreicher: In einer Reihe von kurzen Artikeln werden wir versuchen, zu klären, wie sich die Lösung von Microsoft von den gewohnten Tools unterscheidet.
Grundlegende Funktionen
Natürlich ist Windows PowerShell in erster Linie eine Befehlszeilenschnittstelle mit einer Skriptsprache, die ursprünglich auf der .NET Framework-Plattform basierte und später auf .NET Core entwickelt wurde. Im Gegensatz zu Shells, die Textdaten akzeptieren und zurückgeben, arbeitet Windows PowerShell mit .NET-Klassen, die Eigenschaften und Methoden besitzen. PowerShell ermöglicht das Ausführen gängiger Befehle und bietet Zugang zu COM-, WMI- und ADSI-Objekten. Dabei verwendet es verschiedene Speicherorte, wie das Dateisystem oder die Windows-Registry, für die sogenannte Provider bereitgestellt wurden. Erwähnenswert ist die Möglichkeit, ausführbare PowerShell-Komponenten in andere Anwendungen zu integrieren, um verschiedene Operationen durchzuführen, auch über grafische Benutzeroberflächen. Umgekehrt bieten viele Windows-Anwendungen Zugriff auf ihre Steuerungsoberflächen durch PowerShell.
Windows PowerShell ermöglicht:
- Ändern der Betriebssystemeinstellungen;
- Verwalten von Diensten und Prozessen;
- Einrichten von Rollen und Serverkomponenten;
- Installieren von Software;
- Verwalten der installierten Software über spezielle Schnittstellen;
- Integration ausführbarer Komponenten in Drittanwendungen;
- Skripte zur Automatisierung von Administrationsaufgaben erstellen;
- Mit dem Dateisystem, der Windows-Registrierungsdatenbank, dem Zertifikatspeicher usw. arbeiten.
Shell und Entwicklungsumgebung
Windows PowerShell existiert in zwei Varianten: Neben dem Konsolenemulator mit der Kommandozeilenoberfläche gibt es eine integrierte Skriptumgebung (Integrated Scripting Environment – ISE). Um auf die Kommandozeilenoberfläche zuzugreifen, genügt es, den entsprechenden Shortcut im Windows-Menü auszuwählen oder powershell.exe aus dem Ausführen-Menü zu starten. Auf dem Bildschirm erscheint ein blaues Fenster, das sich merklich von dem veralteten cmd.exe in seinen Funktionen unterscheidet. Dort gibt es eine Autovervollständigung und andere Funktionen, die Nutzer von Kommandozeilen in Unix-Systemen gewohnt sind.

Für die Arbeit mit der Shell sollten einige Tastenkombinationen bekannt sein:
- Die Pfeiltasten nach oben und unten durchblättern die Befehlsverlauf zur Wiederholung zuvor eingegebener Befehle;
- Die Pfeiltaste nach rechts am Ende der Zeile gibt die vorherige Eingabe Zeichen für Zeichen wieder;
- Strg+Home löscht den eingegebenen Text von der Cursorposition bis zum Zeilenanfang;
- Strg+End löscht den Text von der Cursorposition bis zum Zeilenende.
F7 öffnet ein Fenster mit den eingegebenen Befehlen und ermöglicht die Auswahl eines davon. In der Konsole funktioniert auch die Texthighlighting mit der Maus, das Kopieren und Einfügen, das Positionieren des Cursors, das Löschen und die Rücktaste – alles, wie wir es mögen.

Windows PowerShell ISE ist eine vollwertige Entwicklungsumgebung mit einem Editor, der Tabs und Syntaxhervorhebung unterstützt, einem Befehlsgenerator, einem integrierten Debugger und weiteren programmierfreundlichen Funktionen. Wenn Sie im Editor der Entwicklungsumgebung nach dem Namen eines Befehls ein Minuszeichen eingeben, erhalten Sie in der Dropdown-Liste alle verfügbaren Parameter mit Angabe des Typs. PowerShell ISE lässt sich entweder über die Verknüpfung im Systemmenü oder mit der ausführbaren Datei powershell_ise.exe starten.

Cmdlets
In Windows PowerShell gibt es sogenannte Cmdlets. Diese sind spezialisierte .NET-Klassen mit vielfältigen Funktionalitäten. Sie werden nach dem Muster "Verb-Substantiv" benannt, was an das Subjekt und Prädikat in natürlichen Sprachen erinnert. Zum Beispiel bedeutet Get-Help wörtlich "Holen-Hilfe" oder im Kontext von PowerShell: "Zeigen-Hilfe". Im Grunde entspricht das dem Befehl man in Unix-Systemen, und in PowerShell sollten genau so die Handbücher abgefragt werden, nicht indem man Cmdlets mit dem Schalter --help oder /? aufruft. Vergessen Sie nicht die Online-Dokumentation zu PowerShell: Die von Microsoft ist ziemlich ausführlich.
Neben Get werden in Cmdlets auch andere Verben (und nicht nur Verben, streng genommen) verwendet, um Aktionen zu kennzeichnen. In der folgenden Liste finden Sie einige Beispiele:
Add — hinzufügen;
Clear — leeren;
Enable — aktivieren;
Disable — deaktivieren;
New — erstellen;
Remove — entfernen;
Set — festlegen;
Start — starten;
Stop — stoppen;
Export — exportieren;
Import — importieren.
Es gibt system-, benutzer- und optionale Cmdlets: Bei der Ausführung geben sie alle ein Objekt oder ein Array von Objekten zurück. Sie sind nicht groß-/kleinschreibungsempfindlich, d.h. aus Sicht des Command Interpreters gibt es keinen Unterschied zwischen Get-Help und get-help. Zum Trennen wird das Zeichen ';' verwendet, must jedoch nur gesetzt werden, wenn mehrere Cmdlets in einer Zeile ausgeführt werden.
Windows PowerShell Cmdlets sind in Module gruppiert (z.B. NetTCPIP, Hyper-V usw.), und zum Suchen nach Objekten und Aktionen gibt es das Cmdlet Get-Command. Die Hilfe dazu kann folgendermaßen angezeigt werden:
Get-Help Get-Command 
Standardmäßig zeigt der Befehl eine kurze Hilfe an, aber an die Cmdlets können nach Bedarf Parameter (Argumente) übergeben werden. Mit ihnen kann man beispielsweise detaillierte Hilfe (-Detailed) oder vollständige Hilfe (-Full) abrufen sowie Beispiele auf dem Bildschirm anzeigen (-Examples):
Get-Help Get-Command -ExamplesDie Hilfe in Windows PowerShell wird mit dem Cmdlet Update-Help aktualisiert. Wenn der Befehl zu lang wird, können Sie die Argumente auf die nächste Zeile verschieben, indem Sie das Escape-Zeichen '‘`’' verwenden und Enter drücken – einfach den Befehl auf einer Zeile zu beenden und auf einer anderen fortzusetzen, funktioniert nicht.
Hier sind einige Beispiele für gängige Cmdlets:
Get-Process — zeigt die im System laufenden Prozesse an;
Get-Service — zeigt die Dienste und ihren Status an;
Get-Content — gibt den Inhalt einer Datei aus.
Für häufig verwendete Cmdlets und externe Utilities gibt es in Windows PowerShell kurze Synonyme – Aliase. Zum Beispiel ist dir der Alias für Get-ChildItem. Im Synonymliste befinden sich auch Äquivalente von Befehlen aus Unix-Systemen (ls, ps usw.), und das Cmdlet Get-Help wird über den Befehl help aufgerufen. Die vollständige Liste der Aliase kann mit dem Cmdlet Get-Alias angezeigt werden:

Skripte, Funktionen, Module und die PowerShell-Sprache
Windows PowerShell-Skripte werden als einfache Textdateien mit der Endung .ps1 gespeichert. Sie können nicht durch Doppelklick gestartet werden: Sie müssen mit der rechten Maustaste das Kontextmenü aufrufen und die Option „In PowerShell ausführen“ auswählen. In der Konsole müssen Sie entweder den vollständigen Pfad zum Skript angeben oder in das entsprechende Verzeichnis wechseln und den Dateinamen eingeben. Das Ausführen von Skripten unterliegt auch Richtlinien des Systems, und zur Überprüfung der aktuellen Einstellungen kann das Cmdlet Get-ExecutionPolicy verwendet werden, das einen der folgenden Werte ausgibt:
Restricted — Skripte sind nicht erlaubt (Standard);
AllSigned — nur das Ausführen von von vertrauenswürdigen Entwicklern signierten Skripten ist erlaubt;
RemoteSigned — das Ausführen von signierten und eigenen Skripten ist erlaubt;
Unrestricted — das Ausführen beliebiger Skripte ist erlaubt.
Der Administrator hat zwei Handlungsalternativen. Die sicherste besteht darin, Skripte zu signieren, jedoch ist dies ein recht kompliziertes Unterfangen – wir werden uns in zukünftigen Artikeln damit befassen. Derzeit wählen wir den einfacheren Weg und ändern die Richtlinie:
Set-ExecutionPolicy RemoteSigned 
PowerShell muss hierfür mit Administratorrechten gestartet werden; allerdings kann die Richtlinie auch für den aktuellen Benutzer mit einem speziellen Parameter geändert werden.
Skripte werden in einer objektorientierten Programmiersprache geschrieben, deren Befehle nach dem gleichen Prinzip benannt werden wie zuvor besprochene Cmdlets: „Aktion-Objekt“ („Verb-Nomen“). Der Hauptzweck besteht darin, Administrationsaufgaben zu automatisieren. Es handelt sich jedoch um eine vollwertige interpretierte Sprache, die alle notwendigen Konstrukte bietet: bedingte Anweisungen, Schleifen, Variablen, Arrays, Objekte, Fehlerbehandlung usw. Für das Schreiben von Skripten eignet sich jeder Texteditor, am bequemsten ist es jedoch, Windows PowerShell ISE zu verwenden.
Im Skript können Parameter übergeben, als verpflichtend festgelegt und Standardwerte definiert werden. Darüber hinaus ermöglicht Windows PowerShell das Erstellen von Funktionen und deren Aufruf auf die gleiche Weise wie Cmdlets: Dazu wird die Konstruktion Function und geschweifte Klammern verwendet. Ein Skript mit Funktionen wird als Modul bezeichnet und hat die Erweiterung .psm1. Module müssen in Verzeichnissen gespeichert werden, die in den PowerShell-Umgebungsvariablen definiert sind. Diese können mit dem folgenden Befehl angezeigt werden:
Get-ChildItem Env:PSModulePath | Format-Table -AutoSizePipelines
Im letzten Beispiel haben wir eine Syntax verwendet, die den Benutzern von Unix-Shells geläufig ist. In Windows PowerShell ermöglicht das senkrechte Strichsymbol ebenfalls, die Ausgabe eines Befehls als Eingabe für einen anderen zu verwenden, aber es gibt wesentliche Unterschiede in der Umsetzung der Pipeline: Hier handelt es sich nicht mehr um eine Zeichenfolge oder einen Text. Eingebaute Cmdlets oder benutzerdefinierte Funktionen geben Objekte oder Objektarrays zurück und können auch diese als Eingabe erhalten. Wie im Bourne-Shell und seinen zahlreichen Nachfolgern erleichtert die Pipeline in PowerShell die Ausführung komplexer Aufgaben.
Ein einfaches Beispiel für eine Pipeline sieht so aus:
Get-Service | Sort-Object -property Status 
Zunächst wird der Befehl Get-Service ausgeführt, und anschließend werden alle erhaltenen Dienste zur Sortierung nach dem Status an den Befehl Sort-Object übergeben. Welcher spezifische Parameter das Ergebnis des vorherigen Pipeline-Abschnitts erhält, hängt von seinem Typ ab - in der Regel handelt es sich um InputObject. Weitere Details zu diesem Thema werden in einem speziellen Artikel über die Programmiersprache PowerShell behandelt.
Wenn gewünscht, kann die Kette fortgesetzt und das Ergebnis von Sort-Object an einen weiteren Befehl übergeben werden (sie werden von links nach rechts ausgeführt). Übrigens steht Windows-Nutzern auch die vertraute Unix-artige Konstruktion für die seitenweise Ausgabe zur Verfügung:
Get-Service | Sort-Object -property Status | moreAufgaben im Hintergrund ausführen
Es kommt häufig vor, dass eine bestimmte Anweisung im Hintergrund ausgeführt werden muss, um nicht auf das Ergebnis innerhalb der Shell-Sitzung warten zu müssen. In Windows PowerShell stehen mehrere Befehle für diesen Fall zur Verfügung:
Start-Job — startet eine Hintergrundaufgabe;
Stop-Job — stoppt eine Hintergrundaufgabe;
Get-Job — zeigt die Liste der Hintergrundaufgaben an;
Receive-Job — zeigt das Ergebnis der Ausführung einer Hintergrundaufgabe an;
Remove-Job — entfernt eine Hintergrundaufgabe;
Wait-Job — Rückgabe einer Hintergrundaufgabe an die Konsole.
Zum Starten einer Hintergrundaufgabe verwenden wir das Cmdlet Start-Job und geben den Befehl oder eine Befehlsreihe in geschweiften Klammern an:
Start-Job {Get-Service} 
Mit Hintergrundaufgaben in Windows PowerShell kann man arbeiten, indem man ihre Namen kennt. Lassen Sie uns zunächst lernen, wie man sie anzeigt:
Get-Job 
Jetzt zeigen wir das Ergebnis der Ausführung der Aufgabe Job1:
Receive-Job Job1 | more 
Das ist alles recht einfach.
Remote-Befehlsausführung
Windows PowerShell ermöglicht das Ausführen von Befehlen und Skripten nicht nur auf dem lokalen, sondern auch auf einem entfernten Computer und sogar auf einer gesamten Gruppe von Maschinen. Dafür gibt es mehrere Möglichkeiten:
- Viele Cmdlets haben den Parameter
-ComputerName, aber auf diese Weise lässt sich beispielsweise keine Pipeline erstellen; - Das Cmdlet
Enter-PSSessionermöglicht die Erstellung einer interaktiven Sitzung auf dem Remote-Computer; - Mit dem Cmdlet
Invoke-Commandkann man Befehle oder Skripte auf einem oder mehreren entfernten Computern ausführen.
PowerShell-Versionen
Seit seiner ersten Veröffentlichung im Jahr 2006 hat sich PowerShell erheblich weiterentwickelt. Das Tool ist für eine Vielzahl von Systemen verfügbar, die auf unterschiedlichen Hardware-Plattformen (x86, x86-64, Itanium, ARM) laufen: Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008/2008 R2, Windows 7, Windows 8, Windows 8.1, Windows RT, Windows RT 8.1, Windows Server 2012/2012 R2, Windows 10, Windows Server 2016, GNU/Linux und OS X. Die letzte Version 6.2 wurde am 10. Januar 2018 veröffentlicht. Skripte, die für frühere Versionen geschrieben wurden, werden mit hoher Wahrscheinlichkeit auch in späteren Versionen funktionieren, jedoch kann es bei der Rückwärtskompatibilität zu Problemen kommen, da im Laufe der Jahre zahlreiche neue Cmdlets zu PowerShell hinzugefügt wurden. Um die auf dem Computer installierte Version der Shell zu erfahren, kann man die Eigenschaft PSVersion der eingebauten Variablen $PSVersionTable verwenden:
$PSVersionTable.PSVersion 
Es kann auch der Cmdlet verwendet werden:
Get-Variable -Name PSVersionTable –ValueOnly 
Das Gleiche kann mit dem Cmdlet Get-Host gemacht werden. Tatsächlich gibt es viele Möglichkeiten, aber um sie anzuwenden, muss man die Programmiersprache PowerShell lernen, was wir in .
Ergebnisse
Microsoft ist es gelungen, eine leistungsstarke Kommandozeile mit einer benutzerfreundlichen, integrierten Umgebung für die Skriptentwicklung zu schaffen. Im Gegensatz zu den gewohnten Werkzeugen aus der Unix-Welt besticht sie durch eine tiefe Integration in die Windows-Betriebssysteme sowie in die entsprechende Software und die .NET Core-Plattform. PowerShell kann als objektorientierte Shell bezeichnet werden, da Cmdlets und benutzerdefinierte Funktionen Objekte oder Objektlisten zurückgeben können und diese auch als Eingabe akzeptieren. Wir glauben, dass jeder Serveradministrator unter Windows mit diesem Werkzeug vertraut sein sollte: Die Zeiten, in denen man ohne Kommandozeile auskam, sind vorbei. Eine fortschrittliche Konsolenanwendung ist besonders wichtig auf , aber das ist eine ganz andere Geschichte.
Nur registrierte Benutzer können an der Umfrage teilnehmen. Sind Sie an Contour interessiert?
Welche Themen sollten in den nächsten Artikeln der Reihe zuerst behandelt werden?
53,2%Programmieren in PowerShell123
42,4%Funktionen und Module in PowerShell98
22,1%Wie signiere ich meine eigenen Skripte?51
12,1%Arbeiten mit Speichern über Anbieter (Providers)28
57,6%Automatisierung der Computeradministration mit PowerShell133
30,7%Softwareverwaltung und Integration von PowerShell-Komponenten in Drittanbieterprodukte71
231 Benutzer haben abgestimmt. 37 Benutzer haben sich enthalten.
Quelle: habr.com
