PowerShell 7 und Windows PowerShell - Tobias Weltner - E-Book

PowerShell 7 und Windows PowerShell E-Book

Tobias Weltner

0,0

Beschreibung

Erprobtes Praxiswissen für das Allzweckwerkzeug PowerShell

  • Tobias Weltner ist Organisator der psconf.eu und einer der weltweit führenden PowerShell-Experten
  • Praxiswissen für alle Versionen der PowerShell
  • Verständliche Erklärungen, kompakte und motivierende Code-Beispiele

PowerShell ist eine hochmoderne Shell-Sprache. Im Windows-Umfeld entstanden, ist sie inzwischen für Linux und macOS und die Cloud verfügbar und wird auch zur Gerätesteuerung eingesetzt. Als plattformunabhängige Open-Source-Software ist sie sicher und zukunftsfähig.
Dr. Tobias Weltner, einer der weltweit führenden PowerShell-Experten, erklärt Schritt für Schritt, praxisnah und mit wenigen Zeilen Code, wie man wiederkehrende Aufgaben automatisiert: Ob Sie beruflich Server oder Software remote konfigurieren oder privat Ihre Farbwechsellampen fernsteuern möchten – fast alles ist möglich. Wer das "IT-Allzweckwerkzeug" PowerShell beherrscht, steigert ganz erheblich seine Lösungskompetenz und seinen Wert für ein Unternehmen.
Sie entscheiden selbst, wie schnell und wie tief Sie einsteigen. Bereits nach den ersten Kapiteln werden Sie erfolgreich und effizient Routineaufgaben automatisieren. Dieses Praxisbuch vermittelt Ihnen das nötige Wissen und Know-how, um PowerShell-Code parallel auf hunderten von Servern auszuführen, grafische Oberflächen und Fenster zu erzeugen, Heimgeräte zu steuern und eigene Befehlserweiterungen zu erstellen.

Sie lesen das E-Book in den Legimi-Apps auf:

Android
iOS
von Legimi
zertifizierten E-Readern

Seitenzahl: 786

Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:

Android
iOS
Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



Zu diesem Buch – sowie zu vielen weiteren O’Reilly-Büchern – können Sie auch das entsprechende E-Book im PDF-Format herunterladen. Werden Sie dazu einfach Mitglied bei oreilly.plus+:

www.oreilly.plus

Dr. Tobias Weltner

PowerShell 7 undWindows PowerShell

Das komplette Praxiswissen für Administratoren und IT-Profis

Dr. Tobias Weltner

Lektorat: Ariane Hesse

Lektoratsassistenz: Anja Weimer, Julia Griebel

Korrektorat: Sibylle Feldmann, www.richtiger-text.de

Satz: Gerhard Alfes, mediaService, www.mediaservice.tv

Herstellung: Stefanie Weidner

Umschlaggestaltung: Michael Oreal, www.oreal.de, unter Verwendung eines Fotos von iStock by Getty Images von querbeet, Stock-Fotografie-ID184997148

Bibliografische Information der Deutschen Nationalbibliothek

Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der DeutschenNationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.

ISBN:

Print     978-3-96009-163-9

PDF      978-3-96010-479-7

ePub     978-3-96010-480-3

mobi     978-3-96010-481-0

1. Auflage 2021

Copyright © 2021 dpunkt.verlag GmbH

Wieblinger Weg 17

69123 Heidelberg

Dieses Buch erscheint in Kooperation mit O’Reilly Media, Inc. unter dem Imprint »O’REILLY«. O’REILLY ist ein Markenzeichen und eine eingetragene Marke von O’Reilly Media, Inc. und wird mit Einwilligung des Eigentümers verwendet.

Hinweis:Dieses Buch wurde auf PEFC-zertifiziertem Papier aus nachhaltiger Waldwirtschaft gedruckt. Der Umwelt zuliebe verzichten wir zusätzlich auf die Einschweißfolie.

Schreiben Sie uns:Falls Sie Anregungen, Wünsche und Kommentare haben, lassen Sie es uns wissen: [email protected].

Die vorliegende Publikation ist urheberrechtlich geschützt. Alle Rechte vorbehalten. Die Verwendung der Texte und Abbildungen, auch auszugsweise, ist ohne die schriftliche Zustimmung des Verlags urheberrechtswidrig und daher strafbar. Dies gilt insbesondere für die Vervielfältigung, Übersetzung oder die Verwendung in elektronischen Systemen.

Es wird darauf hingewiesen, dass die im Buch verwendeten Soft- und Hardware-Bezeichnungen sowie Markennamen und Produktbezeichnungen der jeweiligen Firmen im Allgemeinen warenzeichen-, marken- oder patentrechtlichem Schutz unterliegen.

Alle Angaben und Programme in diesem Buch wurden mit größter Sorgfalt kontrolliert. Weder Autor noch Verlag können jedoch für Schäden haftbar gemacht werden, die in Zusammenhang mit der Verwendung dieses Buches stehen.

5 4 3 2 1 0

Inhalt

Vorwort

Wie Sie dieses Buch nutzen

Achtung

Noch mehr Unterstützung

1PowerShell: Erste Schritte

PowerShell installieren

Windows-Betriebssystem

PowerShell nachrüsten: macOS und Linux

Kompatibilität der PowerShell

PowerShell einrichten

Vorsicht mit Administratorrechten!

Interaktive Befehle eingeben

Autovervollständigung: Tippfehler vermeiden

Befehlszeilen erneut verwenden

Groß- und Kleinschreibung

Unvollständige und mehrzeilige Eingaben

PowerShell-Hilfe aus dem Internet nachladen

Skriptausführung erlauben

Weitere PowerShell-Einschränkungen

Wichtige PowerShell-Werkzeuge

PowerShell-ISE-Editor

VSCode (Visual Studio Code)

Windows-Terminal

Codebeispiele automatisch herunterladen

Befehl zum Herunterladen von Codebeispielen nachrüsten

Beispielcode in Zwischenablage kopieren

Beispielcode sofort ausführen

Profilskripte: PowerShell dauerhaft anpassen

Einzelne Profilskripte verwenden

Fragen stellen

Alle Skripte herunterladen

Zusammenfassung

Ausführungsrichtlinie festlegen

Hilfe nachrüsten

Windows PowerShell aktualisieren

Hilfsbefehle zum Download von Beispielcode

»Fehlende Befehle« verstehen

Zusätzliche Werkzeuge

2Überblick: Was PowerShell leistet

Befehle lösen Aufgaben

Literale

Text

Zahlen

Datum und Zeit

Kommentare

Cmdlets: die PowerShell-Befehle

Nach Tätigkeitsbereich suchen (»Noun«)

Nach Tätigkeit suchen (»Verb«)

Nach Herkunft suchen

Standardisierte Verben

Cmdlets per Fenster suchen

Syntax verstehen

Ausführliche Hilfe und Beispiele

Anwendungsprogramme (Applications)

Applications starten

Applications finden

Systembefehle nutzen

Hilfe für Applications abrufen

.NET-Methoden

Methoden verwenden

Hilfe für Methoden

Noch mehr Methoden

Methoden: vielseitiger, aber kleinteiliger

Operatoren

Operatoren nachschlagen

Vergleichsoperatoren

Textoperatoren

Zuweisungen und Pipeline

Zahlenreihen

Befehle verbinden

Das Türchen-Modell

Normalfall: »Türchen 3«

Modernes Pipeline-Streaming: »Türchen 1«

Klassische Variablen: »Türchen 2«

Neue Befehle nachrüsten

Beispiel 1: QR-Codes generieren

Beispiel 2: Automatische HTML-Reports

Beispiel 3: Musik spielen

Zusammenfassung

3Skripte und Funktionen

PowerShell-Skripte verstehen

Skriptcode eingeben

Skripte mit dem ISE-Editor entwickeln

Neues Skript anlegen

Skripte mit dem VSCode-Editor entwickeln

Neue Skripte anlegen

Skripte ausführen

Skripte innerhalb von PowerShell starten

Skripte außerhalb von PowerShell starten

Skripte automatisch starten

Skriptstart durch Task Scheduler

Profilskripte – die Autostartskripte

Profilskript anlegen und öffnen

Typische Profilskriptaufgaben durchführen

Neue Befehle: Funktionen

Schritt 1: Nützlicher Code

Schritt 2: Als Funktion verpacken

Schritt 3: Parameter definieren

Schritt 4: Funktionen dauerhaft verfügbar machen

Funktionen im Modul permanent verfügbar

Die gemeinsame Grundlage: der Skriptblock

Skripte sind gespeicherte Skriptblöcke

Funktionen sind vorgeladene Skriptblöcke

Module laden Funktionen bei Bedarf in den Speicher

Skript oder Funktion?

4Cmdlets – PowerShell-Befehle

Parameter steuern Cmdlets

Argumente an Parameter übergeben

Parameter machen Cmdlets vielseitig

Politisch inkorrekt: positionale Argumente

Gratiszugabe: »Common Parameters«

Auf Fehler reagieren

Vielseitigkeit durch Parametersätze

»Schmal, aber tief« – Cmdlets sind Spezialisten

Mehrere Parametersätze: noch mehr Vielseitigkeit

Praxis: Ereignisse aus dem Ereignislogbuch lesen

»ISA/HASA« – wie Cmdlets in der Pipeline funktionieren

Das »ISA/HASA«-Prinzip

Praxisnutzen

Vorteile des Pipeline-Streamings

5Die PowerShell-Pipeline

Aufbau der PowerShell-Pipeline

Befehle reichen Ergebnisse weiter

Pipeline steuert Befehle

Prinzipieller Aufbau der Pipeline

Die sechs wichtigsten Pipeline-Befehle

Select-Object

Detailinformationen festlegen

Unsichtbare Eigenschaften sichtbar machen

Eine bestimmte Eigenschaft auswählen: -ExpandProperty

Selbst festlegen, welche Informationen wichtig sind

Weitere Informationen anfügen

-First, -Last und -Skip

Berechnete Eigenschaften

Where-Object

Clientseitiger Universalfilter

Leere Elemente aussortieren

Fortgeschrittene Syntax bietet mehr Möglichkeiten

Out-GridView: das »menschliche« Where-Object

Sort-Object

Cmdlet-Ergebnisse sortieren

Sortierung mit anderen Cmdlets kombinieren

Datentyp der Sortierung ändern

Mehrere Spalten in umgekehrter Sortierung

Group-Object

Häufigkeiten feststellen

Daten gruppieren

Berechnete Gruppierungskriterien

Measure-Object

Statistische Berechnungen

Ordnergrößen berechnen

Foreach-Object

Grundprinzip: eine Schleife

Format-Cmdlets

Gefährlich: Format-Cmdlets verändern Objekte

Mehrspaltige Anzeigen

Tabellenausgabe mit Gruppierung

6Arrays und Hashtables

Arrays verwenden

Auf Array-Elemente zugreifen

Eigene Arrays (und einige Fallen)

Automatische Array-Erzeugung

Manuelle Array-Erzeugung

Hashtables – »sprechende Arrays«

Hashtables in Objekte umwandeln

Neue Objekte mit Eigenschaften initialisieren

7PowerShell-Laufwerke

Dateisystemaufgaben meistern

Cmdlets für das Dateisystem finden

Erste Schritte

Ordner anlegen

Dateien anlegen und Informationen speichern

Encoding von Textdateien

Encodings sichtbar machen

Dateien finden

Dateien und Ordner kopieren

Dateien umbenennen

Dateien und Ordner löschen

Größe eines Laufwerks ermitteln

Größe eines Ordners ermitteln

Umgebungsvariablen

Alle Umgebungsvariablen auflisten

Auf einzelne Umgebungsvariablen zugreifen

Umgebungsvariablen ändern

Windows-Registrierungsdatenbank

Schlüssel suchen

Werte lesen

Neue Registry-Schlüssel anlegen

Registry-Schlüssel löschen

Werte hinzufügen, ändern und löschen

Virtuelle Laufwerke und Provider

Neue PowerShell-Laufwerke

Ohne Laufwerksbuchstaben direkt auf Provider zugreifen

-Path oder -LiteralPath?

Existenz eines Pfads prüfen

Pfadnamen auflösen

8Operatoren und Bedingungen

Operatoren – Aufbau und Namensgebung

Wie Operatornamen aufgebaut sind

Unäre Operatoren

Zuweisungsoperatoren

Vergleichsoperatoren

Ternary-Operator

Unterscheidung zwischen Groß- und Kleinschreibung

Unterschiedliche Datentypen vergleichen

Vergleiche umkehren

Vergleiche kombinieren

Vergleiche auf Arrays anwenden

Bedingungen

if-Bedingung

switch-Bedingung

Where-Object

Null-Koaleszenz-Operatoren

Pipeline-Verkettungsoperatoren

9Textoperationen und reguläre Ausdrücke

Texte zusammenfügen

Doppelte Anführungszeichen lösen Variablen auf

Der Formatierungsoperator -f

Array-Elemente in Text umwandeln

Textstellen finden und extrahieren

Texte splitten

Informationen in Texten finden

Reguläre Ausdrücke: Textmustererkennung

Erste Schritte: Textmuster basteln

Eigene reguläre Ausdrücke konzipieren

Textstellen ersetzen

Einfache Ersetzungen

Sichere Ersetzungen mit -replace

Mehrere Zeichen durch eins ersetzen

Split und Join: eine mächtige Strategie

Dateipfade ändern

X500-Pfade auslesen

10Anwendungen und Konsolenbefehle

Programme starten

Optionen für den Programmstart festlegen

Argumente an Anwendungen übergeben

Hilfe für Konsolenbefehle anzeigen

Beispiel: Lizenzstatus von Windows überprüfen

Ergebnisse von Anwendungen weiterverarbeiten

Error Level auswerten

Fragen an Benutzer stellen mit choice.exe

Rückgabetext auswerten

Laufende Programme steuern

Feststellen, ob ein Prozess läuft

Auf einen Prozess warten

Einstellungen laufender Prozesse ändern

Prozesse vorzeitig abbrechen

11Typen verwenden

Typumwandlungen

Geeignete Datentypen auswählen

Explizite Umwandlung

Deutsches Datumsformat mit dem Operator -as

Verkettete Umwandlungen

Typen: optimale Informationsbehälter

Implizite Umwandlung

Typisierte Variablen

Parameter und Argumente

Vergleichsoperationen

Statische Methoden eines Typs verwenden

Dateiextension ermitteln

Mathematische Funktionen

Zahlenformate konvertieren

DNS-Auflösung

Umgebungsvariablen

Pfade zu Systemordnern finden

Konsoleneinstellungen

Spezielle Datumsformate lesen

Statische Eigenschaften verwenden

Neue .NET-Typen finden

Type Accelerators untersuchen

Typen nachladen

Assembly-Namen feststellen

Aktuell geladene Assemblies auflisten

Zusätzliche Assembly nachladen

Assembly aus Datei nachladen

12Mit Objekten arbeiten

Objekte kennenlernen

Objekte funktionieren wie beschriftete Schubladen

Typisierte Variablen

Objekteigenschaften erforschen

Eigenschaften lesen

Eigenschaften ändern

Methoden verwenden

Zusammenfassende Systematik

Eigenschaften

Methoden

Hilfe finden

Neue Objekte herstellen

Konstruktoren verstehen

Ein Credential-Object zur automatischen Anmeldung

Eigene Objekte erstellen

13Eigene Typen und Attribute

Typen (Klassen) selbst herstellen

Einen eigenen Typ erfinden

Neue Objekte eines Typs generieren

Konstruktoren hinzufügen

Methoden zum Typ hinzufügen

Vererbung von Typen

Konstruktoren werden nicht geerbt

Philips Hue Smart Home mit Typen steuern

Kontakt zur Philips Hue Bridge herstellen

Lampen- und Schalterinventar

Lampen und Steckdosen ansprechen

Attribute erstellen

SecureString-Transformationsattribute

Auf API-Funktionen zugreifen

API-Funktion einsetzen

Wiederverwertbare PowerShell-Funktion herstellen

14Parameter für Fortgeschrittene

Argumentvervollständigung

Statische Autovervollständigung

Autovervollständigung über Enumerationsdatentyp

Eigene Enumerationsdatentypen erstellen

Autovervollständigung über ValidateSet

Dynamische Argumentvervollständigung

Zuweisungen mit Validierern überprüfen

ValidateSet

ValidateRange

ValidateLength

ValidatePattern

ValidateCount

ValidateScript

Nullwerte und andere Validierer

Parameter in ParameterSets einteilen

Gegenseitig ausschließende Parameter

Binding über Datentyp

Parameter in mehreren Parametersätzen

Simulationsmodus (-WhatIf) und Sicherheitsabfrage (-Confirm)

Festlegen, welche Codeteile übersprungen werden sollen

Weiterleitung verhindern

Gefährlichkeit einer Funktion festlegen

Dynamische Parameter

Dynamische Parameter selbst definieren

Splatting: Argumente an Parameter binden

Splatting im Alltag einsetzen

Übergebene Parameter als Hashtable empfangen

Mit Splatting Parameter weiterreichen

15Pipeline-fähige Funktionen

Anonyme Pipeline-Funktion

Prototyping

Pipeline-fähige Funktion erstellen

Benannte Parameter

Where-Object durch eine Funktion ersetzen

Kurzes Resümee

Parameter und Pipeline-Kontrakt

ISA-Kontrakt: Pipeline-Eingaben direkt binden

HASA-Kontrakt: Objekteigenschaften lesen

HASA und ISA kombinieren

CSV-Dateien direkt an Funktionen übergeben

Aliasnamen für Parameter

16PowerShellGet und Module

PowerShellGet – die PowerShell-Softwareverteilung

Grundlage »PackageManagement«

PowerShellGet – Softwareverteilung per Cmdlets

Wo PowerShell Module lagert

Unterschiede zwischen Windows PowerShell und PowerShell

Installierte Module untersuchen

Module mit PowerShellGet nachinstallieren

Module finden und installieren

Modul herunterladen

Modul testweise ausführen

Modul dauerhaft installieren

Module aktualisieren

Side-by-Side-Versionierung

Eigene Module veröffentlichen

Eigene Module herstellen

Neue Manifestdatei anlegen

Neue Moduldatei anlegen

Modul testen

Nächste Schritte

Eigene Module verteilen

Netzwerkfreigabe

Modul in Repository übertragen

Modul aus privatem Repository installieren

17Fehlerhandling

Fehlermeldungen unterdrücken

Bestimmen, wie Cmdlets auf Fehler reagieren

Fehler mitprotokollieren lassen

Erfolg eines Befehlsaufrufs prüfen

Fehlerhandler einsetzen

Lokaler Fehlerhandler: try…catch

Globaler Fehlerhandler: Trap

18Windows PowerShell-Remoting

PowerShell-Remoting aktivieren

Zugriff auch auf Windows-Clients

Remoting-Verbindung überprüfen

NTLM-Authentifizierung erlauben

PowerShell-Remoting überprüfen

Erste Schritte mit PowerShell-Remoting

Befehle und Skripte remote ausführen

Kontrolle: Wer besucht »meinen« Computer?

Remotefähigen Code entwickeln

Argumente an Remote-Code übergeben

Ergebnisse vom Remote-Code an den Aufrufer übertragen

Fan-Out: integrierte Parallelverarbeitung

ThrottleLimit: Parallelverarbeitung begrenzen

Double-Hop und CredSSP: Anmeldeinfos weiterreichen

Eigene Sitzungen verwenden

Eigene Sitzungen anlegen

Parallelverarbeitung mit PSSessions

SSH-basiertes Remoting

SSH-Remoting aktivieren

Enter-PSSession über SSH

Invoke-Command über SSH

Unbeaufsichtigte Ausführung und Parallelbearbeitung

19Grafische Oberflächen gestalten

Eigene Fenster herstellen

GUI mit Code definieren

GUI mit XAML definieren

Beispiel: Dienststopper-Anwendung

Index

Vorwort

PowerShell begann vor 15 Jahren als Windows Powershell. Heute ist diese Shell plattformübergreifend auf Windows, Linux und macOS verfügbar und wird begeistert von einer immer größeren Anwendercommunity genutzt.

In diesem Buch werden Sie Schritt für Schritt erfahren, was PowerShell eigentlich ist und was diese Shell alles für Sie tun kann. Ob Sie Administrator »on-premise« sind und lokale Server betreuen, Ihr Unternehmen in der Cloud verwalten oder ob Sie heterogene Umgebungen »unter einen Hut« bringen wollen – PowerShell bietet die Werkzeuge dafür.

Aber auch zu Hause und in der Schule lässt es sich hervorragend einsetzen: PowerShell ist es nämlich egal, ob Sie damit eine Unternehmens-IT administrieren, Ihre Philips-Hue-Homeautomation verwalten oder Sonnenkollektoren steuern. Ob Sie den eigenen NAS-Server auf dem Dachboden sichern, automatisiert Dateien aus dem Internet laden oder vielleicht bloß Matherätsel knacken wollen.

Und genau deshalb ist PowerShell auch in Ausbildung und Schulen spannend: Kaum eine andere kostenlose Programmierumgebung und Shell unterstützt so viele Programmierkonzepte auf so vielen Plattformen – angefangen von Befehlsaufrufen über moderne Programmiertechniken wie den Einsatz von Funktionen und Objekten bis hin zu nativer Klassenunterstützung, Vererbung und universellem Netzwerk-Remoting. Kaum eine andere Umgebung bietet so unmittelbares Feedback wie PowerShell. Ideal also, um im Unterricht und in der Ausbildung anhand von nachvollziehbaren Praxisbeispielen die Funktionsweisen moderner IT auszuprobieren und zu vertiefen.

Dieses Buch bietet zahlreiche Praxisbeispiele aus den unterschiedlichsten Einsatzbereichen und demonstriert schrittweise die vielfältigen Möglichkeiten der PowerShell.

So schlüpfen Sie zu Anfang des Buches in die Rolle des einfachen PowerShell-Anwenders. Sie generieren mit Einzeilern Excel- und HTML-Reports und können mit wenigen Schritten Cloud-Systeme steuern oder Notenblätter aus dem Internet herunterladen und als PDF exportieren.

Von diesen ersten Fingerübungen inspiriert lernen Sie den Minimal-Wortschatz der PowerShell kennen und fügen mehrere Befehle zu eigenen größeren Automationslösungen zusammen.

Die Anwendungsbeispiele werden immer komplexer, und Sie lernen schrittweise alle weiteren wichtigen Konzepte der PowerShell kennen. Dazu gehören Remotezugriffe, direkte Betriebssystemaufrufe, das Erstellen grafischer Oberflächen sowie eigene PowerShell-Befehle und -Module.

Am Ende dieses Buches beherrschen Sie dann eine der modernsten Automationssprachen, die für Windows, Linux und macOS kostenfrei zur Verfügung stehen, und haben sich privat wie beruflich vom einfachen Anwender zum versierten IT-Automatisierer qualifiziert.

Damit Sie auf dieser Reise nicht allzuviel eintippen müssen, automatisiert PowerShell in diesem Buch auf Wunsch natürlich auch das Eintippen der Beispiele für Sie. Schon im ersten Kapitel lernen Sie den passenden Befehl kennen: durch Eingabe der jeweiligen Listingnummer fügt PowerShell den Quellcode aus dem Buch automatisch ein.

Wie Sie dieses Buch nutzen

Dieses Buch setzt keinerlei Grundkenntnisse voraus, wenn Sie von vorn zu lesen beginnen – und das ist auch empfehlenswert. Die Kapitel bauen aufeinander auf. Am Anfang jedes Kapitels finden Sie eine kurze Zusammenfassung, falls es einmal eilig ist.

Die PowerShell-Beispiele im Buch sind jeweils in einer anderen Schriftart formatiert. Damit Sie leichter erkennen, welche Eingaben von Ihnen erwartet werden, wird bei allen Eingaben die PowerShell-Eingabeaufforderung PS> (einschließlich der Leerstelle hinter dem >) vorangestellt. Diese Eingabeaufforderung kann bei Ihnen auch anders aussehen und sollte in den Beispielen natürlich nicht mit eingegeben werden.

Achtung

Bitte verwenden Sie die Begleitmaterialien immer im Kontext des entsprechenden Buchkapitels. Viele der Beispiele funktionieren nur, wenn Sie die entsprechenden Vorarbeiten im Kapitel beachtet haben, oder können auch unerwartete Resultate liefern, wenn man die Beispiele aus dem Zusammenhang des Kapitels reißt.

Noch mehr Unterstützung

Falls trotz aller Sorgfalt einmal Fragen offenbleiben oder Sie weitere Ideen und Themenwünsche haben, besuchen Sie einfach das interaktive Leserforum zu diesem Buch: https://github.com/TobiasPSP/OReilly/discussions

Damit bleibt mir an dieser Stelle nur noch, Ihnen viel Spaß zu wünschen bei der Lektüre dieses Buchs und bei der Arbeit mit der faszinierenden PowerShell! Ich würde mich freuen, von Ihnen im Diskussionsforum zu hören.

Herzlichst,

Tobias Weltner

Kapitel 1

PowerShell: Erste Schritte

In diesem Kapitel:

PowerShell installieren

PowerShell einrichten

Wichtige PowerShell-Werkzeuge

Codebeispiele automatisch herunterladen

Profilskripte: PowerShell dauerhaft anpassen

Zusammenfassung

Ausführlich werden in diesem Kapitel die folgenden Aspekte erläutert:

Windows PowerShell:

In Windows integrierte PowerShell, die auf dem klassischen

.NET Framework Version 4.5

oder höher basiert und auch künftig für Automationsaufgaben im Windows-Umfeld eingesetzt werden kann. Der Startbefehl lautet

powershell.exe

, und die aktuelle Version ist 5.1.

PowerShell:

Neuartige, plattformunabhängige PowerShell, die als portable Anwendung bei Windows parallel zur

Windows PowerShell

verwendet werden kann und auch auf Linux, macOS und weiteren Betriebssystemen zur Verfügung steht. Der Startbefehl lautet

pwsh.exe

. Diese PowerShell beruht auf dem plattformunabhängigen neuen

.NET Framework Core

, das weitgehend kompatibel zum klassischen .NET Framework ist. Die

PowerShell

ist im Gegensatz zur

Windows PowerShell

quelloffen (Open Source).

Autovervollständigung:

Mit einigen Tastendrücken kann man sich bei der Eingabe von Befehlen, Parametern und Argumenten Tipparbeit sparen: vervollständigt Eingaben. Drücken Sie die Taste mehrmals, zeigt PowerShell bei jedem Drücken einen weiteren Vorschlag. + geht in der Reihenfolge wieder einen Schritt zurück. Mit + werden Eingabevorschläge als vollständige Auswahlliste präsentiert. Editoren zeigen dazu ein IntelliSense-Menü an. In der Konsole erscheint ein textbasiertes Auswahlfeld. Unabhängig von den Autovervollständigungsvarianten können Sie mit und frühere Eingaben aus Ihrer Befehlshistorie anzeigen lassen. Diese Liste ist anfangs leer und wächst mit der Verwendung der Konsole.

Zeilen löschen und Befehlsabbruch:

Um die gesamte aktuelle Zeile zu löschen, drücken Sie . Um einen Befehl abzubrechen, drücken Sie + .

Groß- und Kleinschreibung:

PowerShell selbst unterscheidet bei Befehlsnamen und Parametern nicht zwischen Groß- und Kleinschreibung. Ob die Groß- und Kleinschreibung bei Befehlsargumenten (wie zum Beispiel Pfadnamen oder anderen Angaben) wichtig ist, hängt vom jeweiligen Befehl und dem verwendeten Betriebssystem ab. Bei Kennworteingaben beispielsweise kommt es natürlich immer auf die richtige Groß- und Kleinschreibung an.

Achtung

Wenn Sie es eilig haben und die Grundlagen der PowerShell schon kennen, dürfen Sie diesen Einleitungsteil selbstverständlich überspringen. Sie sollten aber in jedem Fall wenigstens den Abschnitt »Zusammenfassung« am Ende dieses Kapitels beachten. Dort werden wichtige Grundeinstellungen besprochen, die die Voraussetzung für viele Beispiele in den folgenden Kapiteln sind.

PowerShell ist eine verblüffend flexible und machtvolle plattformunabhängige Automationssprache, die mit geringem Aufwand ein enormes Spektrum von Aufgaben automatisieren kann.

Dazu zählen typische IT-Administrationsaufgaben ebenso wie völlig andere Einsatzbereiche aus Mathematik, Forschung und Lehre, in der Büroautomation und nicht zuletzt in Hobby und Tüftelei: Schon im nächsten Kapitel werden wir uns kurz der Musikkomposition und Steuerung von MIDI-Musikinstrumenten widmen, und in Kapitel 13 erfahren Sie zum Beispiel, wie PowerShell sogar Lampen und Steckdosen in Ihrem Zuhause fernsteuert. Die Grundlagen und Strategien sind dabei indes immer dieselben.

Bei all diesen Beispielen geht es also ausschließlich um zweierlei: kurzweilig und verständlich möglichst viele Einsatzszenarien der PowerShell vorzustellen, um Ideen zu wecken und eine breite Leserschicht anzusprechen, und die stets gleichen allgemeinen Mechanismen zu verstehen, die dabei zum Einsatz kommen.

Denn mit dem Wissen, das Sie beispielsweise in der Musikkomposition oder auch bei der Fernsteuerung von Elektrogeräten benötigen, können Sie natürlich auch Server aufsetzen oder Drittanbietersoftware für Backup-Lösungen steuern – und umgekehrt. Hier wird deutlich, dass PowerShell ebenfalls eine ideale Plattform für Ausbildung und Schule ist, denn alle modernen IT-Grundlagen lassen sich damit anschaulich und unterhaltsam vermitteln.

Zunächst aber muss PowerShell vollständig eingerichtet werden, und genau darum geht es in diesem ersten Kapitel. Dabei werden auch einige wichtige Sicherheitseinstellungen besprochen, und der Unterschied zwischen PowerShell und Windows PowerShell wird Ihnen schnell klar werden.

Danach folgt ein kleiner Exkurs zu den wichtigsten kostenlosen PowerShell-Tools, mit denen Sie Ihren Computer in eine moderne PowerShell-Entwicklungsumgebung verwandeln.

Zum Abschluss des Kapitels erfahren Sie, wie die vielen Hundert Skriptbeispiele in diesem Buch ohne Tipparbeit direkt von PowerShell aus dem Internet heruntergeladen und ausgeführt werden und wie offengebliebene Fragen unmittelbar an den Autor gerichtet werden können.

Hinweis

In diesem Buch wird das Wort »PowerShell« immer dann kursiv gesetzt, wenn spezifisch die neue plattformübergreifende PowerShell gemeint ist. Der nicht kursiv gesetzte Begriff »PowerShell« bezieht sich allgemein auf die Sprache PowerShell und gilt sowohl für Windows PowerShell als auch für PowerShell.

Schon in diesem Kapitel wird Ihnen bereits PowerShell-Code begegnen, der aber hier als reines »Werkzeug« für die Einrichtung Ihres Computers dient. Sie können den Code natürlich bereits neugierig mustern, aber bitte brüten Sie nicht zu lange über einzelnen Codebeispielen. Es kommt in diesem Kapitel nur auf die Ergebnisse der Codebeispiele an, nicht auf den Code selbst und seine Mechanismen. Diese stehen ab dem zweiten Kapitel im Vordergrund und werden dort dann auch systematisch besprochen.

PowerShell installieren

PowerShell ist plattformunabhängig und kann auf verschiedenen Betriebssystemen ausgeführt werden, zum Beispiel Windows, Linux oder macOS.

Historisch ist PowerShell allerdings als Teil des Windows-Betriebssystems entstanden und dort als sogenannte Windows PowerShell immer automatisch enthalten. Seit 2016 ist diese Fassung in Version 5.1 fertiggestellt, wird auf diesem Stand gehalten und weiter von Microsoft gewartet.

Alle Entwicklungsarbeit geht seit 2016 in die neue, plattformunabhängige PowerShell, bei Drucklegung dieses Buchs in Version 7.2, die bei allen Betriebssystemen zuerst nachinstalliert werden muss. Wie das geschieht, erfahren Sie jetzt, und zwar in separaten Abschnitten für die jeweiligen Betriebssysteme.

Windows-Betriebssystem

In allen Windows-Betriebssystemen ab Server 2008 und Windows 7 ist die PowerShell bereits fester Bestandteil – genauer gesagt die Windows PowerShell. Hier könnten Sie also sofort loslegen, sollten aber wenigstens prüfen, ob Ihre Windows PowerShell auf dem aktuellen Stand ist (dazu gleich mehr).

Noch empfehlenswerter ist es, zusätzlich zur integrierten Windows PowerShell auch die neue PowerShell hinzuzuinstallieren. Beide laufen friedlich parallel nebeneinander, und so können Sie sich ein eigenes Bild von den Unterschieden machen.

Immer vorhanden: Windows PowerShell

Sie starten die Windows PowerShell mit dem Befehl powershell.exe (oder kurz powershell) – wie jedes andere Programm auch. Drücken Sie zum Beispiel + , um das Dialogfeld Ausführen zu öffnen (siehe Abbildung 1.1), und geben den Befehl powershell ein. Dann klicken Sie auf OK.

In der Taskleiste erscheint ein blaues Symbol, das Sie per Rechtsklick und An Taskleiste anheften am besten dauerhaft dort anpinnen. Ein Rechtsklick auf das Symbol öffnet die sogenannte Sprungliste, sozusagen das Cockpit der Windows PowerShell (siehe Abbildung 1.2).

Abbildung 1.1: Windows PowerShell starten

Von hier aus können Sie die PowerShell zum Beispiel mit vollen Administratorrechten starten, und auch der in Windows PowerShell integrierte Editor ISE (Integrated Script Environment) steht hier bereit.

Abbildung 1.2: Sprungliste der Windows PowerShell

Die Windows PowerShell selbst erscheint als blaue oder schwarze Konsole, in die Sie Befehle eingeben können (siehe Abbildung 1.3). Auch wenn es Ihnen bereits in den Fingern juckt: Verschieben Sie Ihre Experimente bitte noch einen Moment – was Sie alles mit PowerShell tun können, veranschaulicht der Rundkurs im nächsten Kapitel.

Lassen Sie uns zunächst alles einsatzbereit machen.

Abbildung 1.3: Die in Windows integrierte Windows PowerShell

Ist Ihre Windows PowerShell noch aktuell?

Falls Sie Windows 10 oder Server 2016 (und besser) verwenden, ist alles gut: Diese Betriebssysteme enthalten Windows PowerShell in Version 5.1, der letzten und ausgereiften Version. Diese Version wird über die gesamte Laufzeit von Windows 10 weitergepflegt und automatisch aktualisiert.

Wer ein älteres Windows-Betriebssystem nutzt, muss Windows PowerShell manuell aktualisieren. Das ist sinnvoll, weil die Codebeispiele dieses Buchs die aktuelle Windows Power-Shell 5.1 voraussetzen. Es ist aber vor allem wichtig, weil Updates stets auch Programmfehler und Sicherheitslücken berichtigen. Schauen Sie also in Ihrer Windows PowerShell kurz nach, welche Version Sie verwenden (siehe Abbildung 1.4). Geben Sie ein:

PS> $PSVersionTable.PSVersion

Zurückgeliefert wird die Version der PowerShell. Bei Versionen kleiner als 5.1 (Major: 5, Minor: 1) ist es Zeit für ein Update.

Abbildung 1.4: Version der PowerShell bestimmen

Weil Windows PowerShell ein fester Teil von Windows ist, kann man sie nur über spezielle Update-Pakete aktualisieren. Diese stehen kostenlos bei Microsoft als sogenannte msu-Pakete zum Download bereit. Bei Drucklegung dieses Buchs fand man das sogenannte Windows Management Framework 5.1 hier: https://www.microsoft.com/en-us/download/details.aspx?id=54616 (siehe Abbildung 1.5).

Tipp

Links ändern sich, und sollte der genannte Link nicht mehr funktionieren, googeln Sie nach »Windows Management Framework 5.1 Download«.

Bitte beachten Sie auf der Downloadseite die Installationshinweise am Ende der Seite, insbesondere wenn Sie noch das alte Windows 7 verwenden. Windows PowerShell erfordert übrigens das .NET Framework 4.5 oder besser, das bei sehr alten Windows-Systemen gegebenenfalls vor dem Update nachinstalliert werden muss.

Bei Clients ist ein Update der Windows PowerShell schnell erledigt. Bei Servern sollten Sie sich dagegen vor dem Update unbedingt genauer informieren: Serversoftware wie Microsoft Exchange kann auf eine ganz bestimmte Windows PowerShell-Version festgelegt sein. Entweder aktualisieren Sie in so einem Fall Windows PowerShell gemeinsam mit den übrigen Serverkomponenten, die davon abhängen, oder Sie installieren, wenn Ihnen das zu heikel oder zu aufwendig ist, parallel zu Windows PowerShell kurzerhand die neue moderne PowerShell und arbeiten künftig einfach mit dieser, während Sie Windows PowerShell unverändert lassen.

Abbildung 1.5: Windows PowerShell ist Teil des Windows Management Framework.

PowerShell 7: die »neue« PowerShell

Weil Windows PowerShell in das Windows-Betriebssystem fest integriert ist, kann sie – wie Sie gerade erlebt haben – nur relativ umständlich aktualisiert werden. Erst recht steht sie nicht auf anderen Betriebssystemen zur Verfügung. Deshalb hat das Microsoft-Entwicklungsteam um Steve Lee im Jahr 2016 die Entwicklung der Windows PowerShell abgeschlossen.

Alle folgenden Versionen der PowerShell wurden fundamental anders entwickelt: Sie sind nicht mehr Bestandteil von Windows, sondern eigenständige portable Anwendungen, die fortan auf dem neuen plattformunabhängigen .NET Framework Core basieren. So kann Power-Shell nun auch auf Linux, macOS und anderen Betriebssystemen eingesetzt werden.

Die neue PowerShell heißt auch nicht länger Windows PowerShell, sondern nur noch Power-Shell, die Anwendung pwsh.exe anstelle von powershell.exe.

Darüber hinaus ist PowerShell quellcodeoffen (Open Source) und portabel. Sie kann also beliebig oft und in beliebigen Versionen parallel existieren, und wenn Sie möchten, könnten Sie sie sogar wie ein persönliches Werkzeug auf einem USB-Stick bei sich tragen und vom Stick aus starten.

So ist die neue PowerShell sogar für Windows-Anwender interessant. Installieren Sie sie parallel zur vorhandenen Windows PowerShell, können Sie wahlweise Windows PowerShell über den Befehl powershell starten oder eben PowerShell über den Befehl pwsh.

Profitipp

Das wirft in Unternehmen häufig die Frage auf, ob (und, wenn ja, wie) man unternehmensweit von Windows PowerShell auf PowerShell umsteigen sollte. Schließlich ist die Windows PowerShell ja inzwischen »veraltet« und wird nicht länger weiterentwickelt. Stimmt das?

Nein. Windows PowerShell ist keineswegs abgekündigt und wird bis ans Ende der Laufzeit von Windows 10 weiter voll von Microsoft unterstützt. Auch etwaige Sicherheitslücken, sollten sie denn auftreten, werden weiterhin behoben, und Windows PowerShell ab Version 5.1 wird über das automatische Windows Update automatisch gepflegt.

Deshalb spricht nichts dagegen, Windows PowerShell auch weiterhin einzusetzen. Windows PowerShell hat gegenüber PowerShell sogar zwei unternehmenskritische Vorteile:

Automatische Verfügbarkeit: Weil Windows PowerShell fester Bestandteil von Windows ist, steht sie immer automatisch zur Verfügung und wird ebenso automatisch aktualisiert. Wollen Sie stattdessen die neuere PowerShell einsetzen, müssten Sie sich eine eigene Deployment-Strategie überlegen, also PowerShell in eigener Verantwortung auf alle Computer im Unternehmen verteilen und natürlich auch zeitnah aktuell halten.Vollständiges .NET Framework:Windows PowerShell basiert auf dem klassischen vollständigen .NET Framework 4.5. Dies ist eine Softwarebibliothek, aus der sich die meisten Windows-Anwendungen bedienen. Die plattformübergreifende PowerShell dagegen basiert auf dem abgespeckten .NET Framework Core, derzeit in Version 3.1. Obwohl dieses Framework rund 99 % der notwendigen Funktionen enthält, besteht doch die Möglichkeit, dass bestimmte Erweiterungen oder ältere Skripte darauf nicht lauffähig sind.

Wenn Sie also nicht unbedingt auf bestimmte neue Funktionalitäten in PowerShell angewiesen sind, spricht überhaupt nichts dagegen, im Unternehmen auch weiterhin flächendeckend Windows Power-Shell einzusetzen. Spezialisten und PowerShell-Entwickler können davon unbenommen auf ihren eigenen Entwicklungssystemen und in eigener Regie natürlich dennoch bereits die neue PowerShell einsetzen, wenn sie ihnen Vorteile bietet.

Einfache Installation über den Microsoft Store

Am einfachsten funktioniert die Installation der PowerShell über den Microsoft Store. Öffnen Sie ihn, indem Sie im Windows-Startmenü nach »Store« suchen.

Achtung

In vielen Unternehmensumfeldern ist der Zugang zum Microsoft Store abgeschaltet. Hier installieren Sie die neue PowerShell manuell (siehe unten). Besondere Administratorrechte sind für die Installation nicht notwendig.

Natürlich kann auch die Windows PowerShell den Store für Sie öffnen (denn PowerShell kann alles, was auch per Maus zu bewerkstelligen ist – sofern Sie die passenden Befehle kennen):

Start-Process shell:appsFolder\Microsoft.WindowsStore_8wekyb3d8bbwe!App

Listing 1.1: Microsoft Store mit PowerShell öffnen

Wichtig

Wenn Sie die Codebeispiele aus dem Buch nicht von Hand eingeben wollen, rüsten Sie den Befehl L mit dieser Zeile nach:

PS> Invoke-RestMethod -Uri https://tinyurl.com/codeAusBuch -UseBasicParsing | New-Item -Path

function: -Name L -Force | Out-Null

Geben Sie hinter dem Befehl die Listing-Nummer an, beispielsweise:

PS> L 1.1

Listing 1.1 liegt in der Zwischenablage. Fügen Sie es mit STRG+V in Konsole oder Editor ein.

Mehr zum Befehl L, welche sonstigen Tricks er auf Lager hat und wie Sie den Befehl dauerhaft verfügbar machen, erfahren Sie ab Seite 63.

Klicken Sie im Microsoft-Store-Fenster auf Suchen und geben Sie als Suchwort »PowerShell« ein. Klicken Sie auf PowerShell Preview und dann auf Installieren (siehe Abbildung 1.6).

Abbildung 1.6: PowerShell 7 als Preview über den Microsoft Store installieren

Hinweis

Die Preview-Fassung der PowerShell enthält jeweils die allerneuesten Funktionen und eignet sich besonders gut zum Experimentieren und Kennenlernen. Darüber hinaus steht im Store neuerdings auch die Produktionsversion ohne den Zusatz »Preview« zur Verfügung.

Falls der Store Sie übrigens um Anmeldedaten bittet oder dazu drängen will, ein Benutzerkonto anzulegen, lehnen Sie dankend ab. Eine Anmeldung ist zum Herunterladen und Installieren nicht nötig.

Nach der Installation wird die neue PowerShell über den Befehl pwsh gestartet. Drücken Sie also zum Beispiel + und geben Sie den Befehl pwsh ins Dialogfeld Ausführen ein. Dann klicken Sie auf OK.

Die neue PowerShell öffnet ein Konsolenfenster mit schwarzem Hintergrund (bei Windows PowerShell ist der Hintergrund blau). Auch das Symbol der neuen PowerShell ist schwarz und nicht blau. In der Titelleiste des Konsolenfensters lesen Sie außerdem den Pfad, unter dem die neue PowerShell installiert wurde.

Klicken Sie das Symbol der neuen PowerShell in der Taskleiste mit der rechten Maustaste an und wählen Sie An Taskleiste anheften. So bleibt es dauerhaft sichtbar, und Sie können künftig bequem per Mausklick die passende PowerShell öffnen (siehe Abbildung 1.7).

Abbildung 1.7: Windows PowerShell und PowerShell lassen sich in Windows parallel betreiben.

Tipp

Die angehefteten Symbole der Taskleiste befinden sich übrigens in einem separaten versteckten Ordner, den Sie über den folgenden Befehl öffnen können:

PS> explorer "$env:appdata\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar"

Wenn Sie die Version der neuen PowerShell durch Eingabe von $PSVersion überprüfen, offenbaren sich erste Unterschiede (siehe Abbildung 1.8):

Abbildung 1.8: Eine als »App« über den Microsoft Store installierte PowerShell 7.1

PSVersion meldet die neue Version, und PSEdition zeigt Core. Bei Windows PowerShell steht hier Desktop.

Hinweis

Die Bezeichnungen in PSEdition haben ausschließlich historische Gründe:

Ursprünglich hieß die neue PowerShell nämlich PowerShell Core und war als minimalistische Version zur reinen Remote-Verwaltung der »Nano-Server« gedacht, denen man die Benutzeroberfläche wegrationalisiert hatte.

Weil die Entwicklung der Nano-Server aber schnell wieder eingestellt wurde, hat man PowerShell Core danach zu einer plattformübergreifenden Shell weiterentwickelt. Das Wort »Core« passt nun natürlich nicht mehr, und so heißt diese plattformübergreifende PowerShell heute einfach nur PowerShell. In der Eigenschaft PSEdition wird sie indes weiterhin Core genannt.

PowerShell manuell installieren

Künftig ist zwar geplant, in die Windows PowerShell einen Befehl zu integrieren, mit dem man die neue PowerShell automatisch herunterladen und installieren kann, bisher gibt es diesen bequemen Befehl jedoch nicht.

Man kann ihn allerdings bereits nachrüsten. Dafür sind keine besonderen Berechtigungen nötig. Mit diesem neuen Befehl lässt sich die plattformübergreifende PowerShell besonders flexibel manuell installieren, zum Beispiel auch dann, wenn der Zugang zum Microsoft Store nicht zur Verfügung steht.

Öffnen Sie dazu zunächst eine Windows PowerShell, zum Beispiel über + und dann powershell.

Danach führen Sie den folgenden Befehl aus (siehe Listing 1.2), um das neue Cmdlet Install-PowerShell nachzurüsten:

Invoke-RestMethod -Uri https://aka.ms/install-powershell.ps1 -UseBasicParsing | New-Item -Path

function: -Name Install-PowerShell | Out-Null

Listing 1.2: Fehlenden Installationsbefehl nachrüsten

Invoke-RestMethod lädt aus dem Internet den Quellcode für den neuen Befehl herunter. Diesen Quellcode könnten Sie auch sichtbar machen, indem Sie die Internetadresse in einen Browser eingeben:

Abbildung 1.9: Microsoft stellt ein Installationsskript für PowerShell 7 zur Verfügung.

New-Item verwandelt den heruntergeladenen Quellcode dann in einen neuen Befehl namens Install-PowerShell. Er steht danach sofort zur Verfügung, und mit ihm können Sie nun ganz bequem PowerShell 7 nachinstallieren.

Hinweis

Mehr zu selbst definierten Cmdlets erfahren Sie in Kapitel 14. Was es mit New-Item und dem Laufwerk function: auf sich hat, ist Thema von Kapitel 7.

Der folgende Befehlsaufruf würde beispielsweise die aktuelle Produktivversion von PowerShell 7 im Ordner c:\ps7test installieren und diesen Ordner zur Path-Umgebungsvariablen hinzufügen, sodass der Befehl pwsh von überall aus aufrufbar würde:

PS> Install-PowerShell -Destination c:\ps7test -AddToPath

In manchen Unternehmensszenarien verbieten die Sicherheitseinstellungen die Installation auf diese Weise, und Sie erhalten stattdessen rote Fehlermeldungen. Installieren Sie PowerShell 7 dann stattdessen als verwaltetes MSI-Paket:

PS> Install-PowerShell -UseMSI

Wird PowerShell 7 als MSI-Paket installiert, erscheint ein Dialogfeld mit Installationsoptionen. Übernehmen Sie die vorgegebenen Optionen. Wenn Sie später auch remote auf PowerShell 7 zugreifen möchten, aktivieren Sie zusätzlich im Dialogfeld die Option für das sogenannte Remoting.

Auch eine unbeaufsichtigte Installation ist dabei mit dem Parameter -Quiet möglich. Ob Power-Shell indes tatsächlich mit -Quiet unbeaufsichtigt installiert werden kann, hängt davon ab, ob Sie die Installation mit vollen Administratorrechten durchführen. Ohne sie erscheint trotz -Quiet ein Dialogfeld.

Profitipp

Da PowerShell eine »portable App« ist, können Sie potenziell so viele Versionen parallel zueinander in unterschiedlichen Ordnern installieren, wie Sie mögen, oder die portable PowerShell auf einem USB-Stick mit sich führen. Allerdings führt das zwangsläufig zu einem Dilemma: Welche davon würde nun der Befehl pwsh starten?

Wenn Sie den absoluten Pfadnamen verwenden, also den kompletten Pfadnamen einschließlich der Ordner, ist die Sache klar. Wird dagegen nur pwsh eingegeben, durchsucht Windows die Ordner in der Umgebungsvariablen Path und startet den ersten Treffer. Hier ist dann also die Reihenfolge maßgeblich, in der Ihre verschiedenen Installationen in der Umgebungsvariablen Path aufgeführt sind.

Sie können den Inhalt der Umgebungsvariable mit diesem Befehl auflisten:

PS> $env:path -split ';'

C:\ps7test

C:\WINDOWS\system32

C:\WINDOWS

C:\WINDOWS\System32\Wbem

...

Falls Sie PowerShell gestartet haben und nachträglich herausfinden möchten, wo diese PowerShell eigentlich gespeichert ist, wählen Sie folgenden Befehl:

PS> [Environment]::CommandLine

C:\ps7test\pwsh.dll

In diesem Beispiel sehen Sie, dass PowerShell aus dem Ordner c:\ps7test gestartet wurde. Sie sehen übrigens auch, dass die neue PowerShell eigentlich eine Bibliothek mit der Dateierweiterung *.dll ist. Der Startbefehl pwsh.exe leitet den Aufruf also bloß an diese Bibliothek weiter. Nerds wie ich finden so etwas spannend, aber Sie können dieses Detail auch höflich ignorieren.

Den Pfad zur jeweils gerade genutzten PowerShell finden Sie hiermit heraus:

PS> (Get-Process -Id $pid).Path

C:\ps7test\pwsh.exe

Die Variable $pid enthält bei allen Versionen der PowerShell stets die Prozess-ID der gerade laufenden PowerShell-Instanz-Sitzung.

Kostenlose Softwareverteilungssysteme: Paketmanager

In Linux-Betriebssystemen sind Paketmanager wie apt, yum, dnf, pacman oder brew seit Langem im Einsatz. Sie laden zusätzliche Software automatisch aus dem Internet und installieren sie. Mit diesen Paketmanagern wird übrigens auch PowerShell auf Linux- und macOS-Systemen installiert.

Bei Windows sind solche Paketmanager noch relativ neu, setzen sich aber auch hier inzwischen durch: Am verbreitetsten sind Chocolatey (https://chocolatey.org/install) und Scoop (https://scoop.sh/).

Auch PowerShell ist auf diesen Zug aufgesprungen und enthält einen eigenen plattformunabhängigen Paketmanager namens PowerShellGet (siehe Kapitel 16): Mit ihm kann man kinderleicht PowerShell-spezifische Ressourcen wie neue Cmdlets oder Skripte nachinstallieren, und schon im nächsten Kapitel begegnen Ihnen zahlreiche Beispiele dazu.

Chocolatey und Scoop

Weil Paketmanager für viele Windows-Anwender noch relativ neu sind, sollen die beiden Windows-Paketmanager Chocolatey und Scoop kurz mit einigen Beispielen zeigen, was sie können und wie Paketmanager funktionieren.

Der grundlegende Unterschied zwischen den beiden ist die Art, wie Software installiert wird und welche Rechte dazu nötig sind: Während Chocolatey Installationspakete auf konventionelle Weise stets für alle Anwender installiert und dazu Administratorrechte benötigt, installiert Scoop Anwendungen ohne Administratorrechte und nur für den aktuellen Anwender als portable Apps.

Chocolatey eignet sich daher eher für die Unternehmens-IT, während sich Scoop an Endanwender richtet, die trotz eingeschränkter Rechte schnell und einfach zusätzliche Software installieren möchten.

Voraussetzungen

In beiden Fällen müssen Sie bei älteren Windows-Systemen zuerst den neueren Sicherheitsprotokollstandard TLS 1.2 erlauben, der bei aktuellen Windows-Versionen automatisch unterstützt wird. Andernfalls können Sie über geschützte https:-Verbindungen keine Daten herunterladen:

[System.Net.ServicePointManager]::SecurityProtocol -bor

[System.Net.SecurityProtocolType]::Tls12

Listing 1.3: Internetsicherheitsprotokoll TLS 1.2 für PowerShell erlauben

Da die Installation über PowerShell-Skripte erfolgt, müssen Sie außerdem mindestens vorübergehend für die aktuelle Sitzung die Ausführung von Skripten erlauben. Sie erfahren in Kapitel 3 mehr darüber. Einstweilen genügt dieser Befehl:

Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force

Listing 1.4: PowerShell-Skripte in der aktuellen PowerShell-Sitzung erlauben

Achtung

Führen Sie die folgenden Befehle unbedingt in einer PowerShell-Konsole aus und nicht in einem Editor wie zum Beispiel dem ISE-Editor.

Die Befehle der hier vorgestellten Softwareverteilungen können im laufenden Betrieb Rückfragen an Sie stellen, zum Beispiel ob ein fehlendes Softwarepaket mitinstalliert werden soll. Solche Rückfragen werden von Editoren wie ISE nicht unterstützt und unterdrückt, sodass das Skript bei Nachfragen in Editoren zu »hängen« scheint.

Chocolatey als Softwareverteilung

Wenn Sie über Administratorrechte verfügen und Software klassisch für alle Anwender des Computers installieren möchten, installieren Sie sich die Paketverwaltung Chocolatey. Dazu benötigen Sie aktivierte Administratorrechte.

Achtung

Chocolatey erfordert grundsätzlich zur Installation volle Administratorrechte und ist schlecht geeignet, wenn Sie Software nur für den aktuellen Anwender installieren möchten. Verwenden Sie für diesen Fall besser Scoop (siehe nächsten Abschnitt).

Listing 1.5 lädt mit Invoke-RestMethod zuerst das Installationsskript von Chocolatey herunter und führt es dann mit Invoke-Expression aus. Das dürfen Sie natürlich nur tun, wenn Sie den Quellen solcher Skripte vertrauen. Geben Sie die URL im Zweifelsfall in die Adressleiste Ihres Browsers ein, um den Code zuerst zu untersuchen oder im Unternehmensumfeld von jemandem freigeben zu lassen.

Invoke-RestMethod -UseBasicParsing -Uri 'https://chocolatey.org/install.ps1' | Invoke-Expression

Listing 1.5: Chocolatey installieren

Alles Weitere übernimmt das Installationsskript und berichtet über alle Schritte, die es ausführt:

Getting latest version of the Chocolatey package for download.

Getting Chocolatey from https://chocolatey.org/api/v2/package/chocolatey/0.10.15.

Downloading 7-Zip commandline tool prior to extraction.

Extracting C:\Users\tobia\AppData\Local\Temp\chocolatey\chocInstall\chocolatey.zip to C:\Users\tobia\AppData\Local\Temp\chocolatey\chocInstall...

Installing chocolatey on this machine

Creating ChocolateyInstall as an environment variable (targeting 'Machine')

Setting ChocolateyInstall to 'C:\ProgramData\chocolatey'

WARNING: It's very likely you will need to close and reopen your shell before you can use choco.

Restricting write permissions to Administrators

We are setting up the Chocolatey package repository.

The packages themselves go to 'C:\ProgramData\chocolatey\lib'

(i.e. C:\ProgramData\chocolatey\lib\yourPackageName).

A shim file for the command line goes to 'C:\ProgramData\chocolatey\bin' and points to an executable

in 'C:\ProgramData\chocolatey\lib\yourPackageName'.

Creating Chocolatey folders if they do not already exist.

WARNING: You can safely ignore errors related to missing log files when

upgrading from a version of Chocolatey less than 0.9.9.

'Batch file could not be found' is also safe to ignore.

'The system cannot find the file specified' - also safe.

Adding Chocolatey to the profile. This will provide tab completion, refreshenv, etc.

WARNING: Chocolatey profile installed. Reload your profile - type . $profile

Chocolatey (choco.exe) is now ready.

You can call choco from anywhere, command line or powershell by typing choco.

Sobald Chocolatey installiert ist, steht der Befehl choco zur Verfügung. Mit ihm kann man nun auch PowerShell über den folgenden Befehl herunterladen und installieren:

PS> choco install powershell-core

Scoop als Softwareverteilung

Interessanter dürfte für viele Anwender Scoop sein, weil es keine Administratorrechte benötigt. Hier wird Software grundsätzlich nur für den aktuellen Benutzer und nur als portable Anwendung heruntergeladen und in einem eigenen Scoop-Ordner zentral zur Verfügung gestellt.

Auch für den Einsatz von Scoop gelten die Voraussetzungen von oben: TLS 1.2 muss aktiviert sein, und PowerShell muss Skripte ausführen dürfen.

Listing 1.6 macht Scoop einsatzbereit. Dazu wird zunächst ähnlich wie bei Chocolatey das Installationsskript heruntergeladen und ausgeführt. Anschließend wird mit scoop install eine portable Version des Paketmanagers git installiert und der sogenannte bucket um weitere Installationsquellen ergänzt, sodass scoop eine besonders große Auswahl an installierbaren Tools und Softwareprodukten installieren kann:

Invoke-RestMethod -UseBasicParsing -Uri 'https://get.scoop.sh' | Invoke-Expression

scoop install git

scoop bucket add extras

Listing 1.6: Scoop installieren

Mit der folgenden Zeile wird PowerShell dann heruntergeladen und installiert:

PS> scoop install pwsh

Scoop speichert alles grundsätzlich als portable Software in einem gemeinsamen Ordner Scoop/Apps innerhalb des Benutzerprofils, sodass die installierte Software dort gefunden und gestartet werden kann:

PS> explorer $home\Scoop\Apps

PS> & $home\Scoop\Apps\pwsh\current\pwsh.exe

Anders als bei Chocolatey obliegt es aber nun Ihnen, die neu installierte Software über Verknüpfungen im Startmenü, auf dem Desktop oder an anderen leicht erreichbaren Orten bereitzustellen.

Mit scoop installieren Sie natürlich nicht nur PowerShell. Es können sehr bequem und schnell verschiedenste Tools und Anwendungen heruntergeladen und installiert werden, beispielsweise 7zip oder notepad++:

PS> scoop install 7zip

PS> scoop install notepadplusplus

Um nach weiteren installierbaren Anwendungen zu suchen, verwenden Sie scoop search:

PS> scoop search

PS> scoop search vscode

Mit den folgenden Befehlen installieren Sie beispielsweise die im PowerShell-Umfeld beliebten und an anderer Stelle detailliert besprochenen Tools VSCode und Windows-Terminal:

PS> scoop install vscode-portable

PS> scoop install windows-terminal

Tipp

Software lässt sich in der Regel mit Scoop einwandfrei herunterladen und ausführen. Manche Programme benötigen allerdings gewisse Voraussetzungen. Windows-Terminal zum Beispiel ist nur auf Windows 10 ab Build 1903 ausführbar, und wenn Sie ein anderes oder älteres Betriebssystem verwenden, lässt es sich trotz einwandfreier Installation nicht starten. Wunder kann also auch Scoop leider nicht vollbringen.

Andere Paketverwaltungssysteme

Auch Microsoft bietet verschiedene eigene Paketmanager. Das .NET Core Software Development Kit (SDK) beinhaltet das .NET Global Tool, mit dem man PowerShell über den folgenden Befehl herunterladen und installieren kann:

PS> dotnet tool install –global PowerShell

Im Frühjahr 2020 hat Microsoft zudem den Windows Package Manager vorgestellt. Ist er installiert, kann PowerShell über den folgenden Befehl heruntergeladen und installiert werden:

PS> winget install powershell

PowerShell nachrüsten: macOS und Linux

Es gibt unzählige unterschiedliche Linux-Distributionen, aber die prinzipiellen Installationsschritte sind immer gleich: Mit einem unterstützten Paketmanager wird PowerShell heruntergeladen und installiert. Dazu ist es meist erforderlich, zuvor den entsprechenden öffentlichen Schlüssel von Microsoft herunterzuladen und zu registrieren. Mit diesem Schlüssel wird geprüft, ob das Installationspaket authentisch und unbeschädigt ist.

Linux

Auf https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-core-on-linux finden Sie für die unterschiedlichen Distributionen und Installationsarten detaillierte Skripte.

Bei Ubuntu 16.04 sieht ein solches Installationsskript zum Beispiel folgendermaßen aus, zur Installation wird hier der Paketmanager apt verwendet:

# Paketliste aktualisieren

sudo apt-get update

# Abhängigkeiten installieren

sudo apt-get install -y wget apt-transport-https software-properties-common

# Microsoft GPG Keys herunterladen

wget -q https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb

# GPG Keys registrieren:

sudo dpkg -i packages-microsoft-prod.deb

# Paketliste aktualisieren:

sudo apt-get update

# PowerShell herunterladen und installieren:

sudo apt-get install -y powershell

# PowerShell starten:

pwsh

Alternativ kann bei ungelösten Paketabhängigkeiten gegebenenfalls der Paketmanager SNAP eine Alternative darstellen:

# PowerShell installieren:

sudo snap install powershell –classic

# PowerShell starten:

pwsh

# PowerShell entfernen:

sudo snap remove powershell

Da PowerShell quellcodeoffen ist, können Sie stets auch die Projektwebseite besuchen, um sich dort über die neuesten Versionen zu informieren, oder die neueste Version für das entsprechende Betriebssystem ohne Paketmanager direkt herunterladen und manuell installieren:

https://github.com/PowerShell/PowerShell

Neben dem Quellcode finden Sie dort die aktuellen Installationsmedien. Scrollen Sie dazu die Startseite nach unten, bis Sie Hinweise ähnlich wie die in Abbildung 1.10 sehen.

Hinweis

Webseiten ändern sich und werden hin und wieder restrukturiert. Unter https://github.com/PowerShell/PowerShell/releases finden Sie aber in jedem Fall die Liste der veröffentlichten Versionen und Installationsmedien.

macOS

Idealerweise würde PowerShell über Apples App Store bereitgestellt. Aktuell ist das indes leider noch nicht der Fall. Die nächsteinfachere Installationsvariante nutzt den Paketmanager homebrew, der dafür zunächst installiert werden muss (https://brew.sh/). Anschließend ist die Installation der PowerShell wie bei allen Paketmanagern trivial:

brew install --cask powershell

pwsh

Um PowerShell von Zeit zu Zeit zu aktualisieren, schreiben Sie:

brew update

brew upgrade powershell --cask

Weitere Informationen finden Sie hier: https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-core-on-macos.

Abbildung 1.10: PowerShell steht für viele Betriebssysteme zur Verfügung.

Kompatibilität der PowerShell

Lassen Sie uns an dieser Stelle gleich die zwangsläufigen Fragen zur Kompatibilität von Power-Shell-Code stellen, die natürlich entstehen, wenn PowerShell auf so vielen unterschiedlichen Plattformen ausführbar ist. Also wie kompatibel ist PowerShell eigentlich?

Kann ich ein PowerShell-Skript auf Linux entwickeln und auf Windows ausführen (oder umgekehrt)?

Kann ich Skripte, die ursprünglich für

Windows PowerShell

konzipiert wurden, unverändert in der neuen

PowerShell

einsetzen?

Kann ich also beispielsweise nahtlos mit all meinem vielleicht schon bestehenden Code im Unternehmen von

Windows PowerShell

auf

PowerShell

umsteigen?

Die Antwort auf alle Fragen lautet wie so häufig: »Kommt drauf an.«

Abwärtskompatibilität der Sprache

Die eigentliche PowerShell-Sprache ist wunderbar abwärtskompatibel: Eine höhere Power-Shell-Version unterstützt also immer die Sprachelemente einer niedrigeren PowerShell-Version. Die neue PowerShell (in Version 7.x) unterstützt daher alle Sprachelemente der älteren Windows PowerShell (Version 5.1).

Lediglich eine spezielle Windows PowerShell-Technik wurde in PowerShell komplett entfernt: Workflows. Dies geschah aber mangels Interesse, denn Workflows hatten sich nie durchgesetzt.

Prinzipiell sind also alte Skripte in der neuen PowerShell unverändert einsetzbar (sofern sie keine Workflows verwenden).

Verfügbarkeit von Befehlen

In der Praxis ist es dann leider doch nicht so einfach, denn das eben Gesagte bezieht sich nur auf »Sprachelemente«. Die PowerShell-Sprache bildet also einen Rahmen, und der ist kompatibel. Die eigentlichen Befehle, die in diesem Rahmen eingesetzt werden, sind es oftmals aber nicht.

Der PowerShell-Befehlssatz ist nämlich nicht fest vorgegeben und noch nicht einmal Teil der eigentlichen PowerShell, sondern speist sich aus verschiedenen externen Quellen (die im nächsten Kapitel genauer dargelegt werden). Deshalb kann es durchaus sein, dass Befehle in einer anderen PowerShell-Version oder auf einem anderen Betriebssystem nicht zur Verfügung stehen:

Aufgegebene Befehle:

Einige

Windows PowerShell

-Befehle wurden bei

PowerShell

endgültig ausgemustert, weil sie entweder veraltet oder Windows-spezifisch waren. Dazu zählen populäre Befehle wie

Get-EventLog

oder

Get-WmiObject

, die bei

Windows PowerShell

sehr häufig eingesetzt wurden. Setzt ein Skript solche Befehle ein, muss es umgeschrieben werden. Für die meisten dieser Befehle gibt es seit PowerShell 3 (bessere) Alternativen (beispielsweise

Get-WinEvent

und

Get-CimInstance

).

Plattformspezifische Befehle:

Andere PowerShell-Befehle (zum Beispiel

Get-Printer

oder

Get-NetIpConfiguration

) und erst recht Anwendungen (zum Beispiel

robocopy.exe

) stammen vom Betriebssystem oder installierter Drittsoftware. Wenn ein Skript solche Befehle verwendet, funktioniert es möglicherweise nicht mehr plattformübergreifend.

Der Ehrlichkeit halber muss gesagt werden, dass all dies meist gar nicht tragisch ist: In der Regel sollen PowerShell-Skripte ganz plattformspezifische Aufgaben automatisieren. Dort, wo die eingesetzten Befehle fehlen, werden sie also typischerweise auch gar nicht benötigt.

Und soll PowerShell doch einmal plattformübergreifende Aufgaben erfüllen, sind die dazu notwendigen Befehle, beispielsweise für Programmaufrufe, Dateisystem- und Fernzugriffe sowie Remoting, in allen PowerShell-Versionen und -Varianten gleichermaßen vorhanden.

Man kann sich PowerShell also am besten vorstellen als ein generisches, plattformübergreifendes Basis-Automationsframework, das je nach verwendeter Software und eingesetztem Betriebssystem wie ein individueller Maßanzug um viele spezifische Befehle ergänzt ist.

Out-GridView

Ein besonderes Szenario gilt für den überaus populären Befehl Out-GridView, mit dem man Auswahldialoge wie den in Abbildung 1.11 erzeugt. Er funktioniert auch in der neuen PowerShell, aber leider nur in Windows. Code, der Out-GridView einsetzt, ist also nicht mehr auf Linux und macOS lauffähig.

»Schuld« daran ist das .NET Framework Core, eine Softwarebibliothek, aus der sich Anwendungsentwickler bedienen dürfen und auf der das neue PowerShell aufbaut. .NET Core unterstützt grafische Oberflächen (derzeit) nur auf dem Windows-Betriebssystem. Das hat Auswirkungen auf alle Befehle, die grafische Oberflächen generieren. Zum Glück sind solche Befehle, einmal abgesehen von Out-GridView, extrem selten.

Um nicht abwarten zu müssen, bis .NET Core vielleicht künftig einmal grafische Oberflächen auf allen Betriebssystemen unterstützt, hat das PowerShell-Team eine textbasierte Alternative zu Out-GridView geschaffen: Out-ConsoleGridView.

Abbildung 1.11: Ein grafisches Universalauswahlfenster funktioniert nur bei Windows.

Dieser Befehl ist derzeit noch kein Teil von PowerShell (und wie bei so vielen guten Ideen bleibt abzuwarten, ob er bis zu Ende entwickelt wird). Einstweilen kann man ihn (nur in PowerShell 7, nicht in Windows PowerShell) mit dem folgenden Befehl nachinstallieren:

PS> Install-Module -Name Microsoft.PowerShell.ConsoleGuiTools -Scope CurrentUser

Nun kann das außerhalb von Windows fehlende Out-GridView durch die plattformübergreifende Variante Out-ConsoleGridView ersetzt werden.

Listing 1.7 zeigt ein Beispiel aus der Praxis, das alle laufenden Anwendungen in einem Auswahlfenster anbietet. Die ausgewählten Anwendungen werden geschlossen (jedenfalls dann, wenn Sie in Listing 1.7 den Parameter -WhatIf entfernen, der ansonsten das Stoppen der Prozesse nur simuliert).

Get-Process |

Where-Object MainWindowHandle |

Select-Object -Property Name, Id, Description |

Sort-Object -Property Name |

Out-GridView -Title 'Prozesse' -OutputMode Multiple |

Stop-Process -WhatIf

Listing 1.7: Einsatzbeispiel eines Auswahldialogs

Listing 1.7 funktioniert in allen PowerShell-Varianten, aber aufgrund des grafischen Auswahlfensters nur in Windows. Um das Skript plattformübergreifend einzusetzen, ersetzen Sie lediglich den Befehl Out-GridView durch Out-ConsoleGridView (sofern Sie den Befehl wie oben nachgerüstet haben).

Out-ConsoleGridView ist eine hervorragende Umsetzung im Stile des bekannten Norton Commander, und die zur Auswahl gestellten Einträge lassen sich bequem per Maus anklicken (siehe Abbildung 1.12).

Abbildung 1.12: Ein textbasiertes plattformübergreifendes Dialogfeld verwenden

PowerShell einrichten

Falls Sie noch nie mit textbasierten Shells gearbeitet haben, lernen Sie jetzt die allerwichtigsten PowerShell-Grundlagen kennen. Dazu gehört auch, wie man bequem und möglichst ohne Tippfehler auch größere Eingaben bewältigt.

Anschließend schauen wir uns gleich noch die wichtigsten Sicherheitseinstellungen an, damit Sie PowerShell auch tatsächlich voll nutzen und alle Beispiele aus diesem Buch ausführen können.

Vorsicht mit Administratorrechten!

Starten Sie die PowerShell nicht routinemäßig mit Administratorrechten. Die PowerShell ist ein Profiwerkzeug, genau wie die Kettensäge des Waldarbeiters. Sie können damit in Sekundenschnelle viel lästige Arbeit erledigen, aber ebenso schnell mit den falschen Befehlen enorme Schäden anrichten.

Solange die PowerShell nicht mit Administratorrechten gestartet wird, sind Sie vor gröbstem Unfug gefeit und können zumindest das Betriebssystem nicht beschädigen. Nutzen Sie Administratorrechte also ausschließlich dann, wenn Aufgaben dies wirklich erfordern und Sie genau wissen, was Sie tun.

Hinweis

Bei Windows lassen sich Administratorrechte nicht nachträglich zuschalten (so wie mit sudo bei Linux). Administratorrechte müssen beim Start einer Anwendung vergeben werden – oder eben nicht. Wenn Sie also bei Windows Administratorrechte benötigen, öffnen Sie eine neue PowerShell explizit als Administrator (siehe Abbildung 1.7).

Interaktive Befehle eingeben

Im Fenster sehen Sie die Eingabeaufforderung. Sie beginnt mit PS, und dahinter steht der Pfadname des Ordners, in dem Sie sich gerade befinden. Eine blinkende Einfügemarke wartet auf Ihre ersten Eingaben. Geben Sie zum Beispiel testweise ein:

PS> hallo

Sobald Sie drücken, wird Ihre Eingabe an PowerShell geschickt und verarbeitet. Das Ergebnis folgt postwendend, und erst jetzt stellt sich heraus, ob PowerShell mit dem, was Sie geschickt haben, etwas anfangen konnte. Falls nicht, erscheint eine spröde rote Fehlermeldung, die bei Windows PowerShell so aussehen könnte:

hallo : Die Benennung "hallo" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei

oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der

Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.

In Zeile:1 Zeichen:1

+ hallo

+ ~~~~~

+ CategoryInfo : ObjectNotFound: (hallo:String) [],CommandNotFoundException

+ FullyQualifiedErrorId : CommandNotFoundException

Bei PowerShell 7 werden Fehlermeldungen etwas abgekürzt, stattdessen erhalten Sie mitunter Korrekturvorschläge (mit derzeit allerdings kaum wahrnehmbarem Praxisnutzen):

hallo: The term 'hallo' is not recognized as a name of a cmdlet, function, script file, or

executable program. Check the spelling of the name, or if a path was included, verify that the path

is correct and try again.

Suggestion [4,General]: The most similar commands are: gal, nal, sal, kill, help, Table, algm,

echo, del, clc.

Rote Fehlermeldungen sorgen bei den meisten Anwendern für einen Adrenalinschub oder führen zu Flüchen, aber eines tun die wenigsten: die Fehlermeldung lesen. Genau das sollten Sie aber tun, denn häufig stecken darin hilfreiche Informationen. So auch hier:

Die Benennung »hallo«, also das, was Sie als Befehl an PowerShell geschickt haben, war kein ausführbarer Befehl. Ausführbare Befehle sind gemäß Fehlermeldung Cmdlets, Funktionen, Skriptdateien oder ausführbare Programme. Damit wissen Sie nun schon einmal ungefähr, was Sie alles bei PowerShell ausführen können.

Autovervollständigung: Tippfehler vermeiden

»Tippen vermeiden heißt Tippfehler vermeiden« – und so sollten Sie sich unbedingt die beiden Tastenkombinationen für die Autovervollständigung merken:

Ein Druck auf genügt, um die aktuelle Eingabe zu vervollständigen. Drücken Sie die Taste mehrmals, um weitere Vorschläge zu erhalten. + blättert einen Vorschlag zurück, falls Sie zu schnell waren.

Drücken Sie + , zeigt die Konsole die noch infrage kommenden Eingaben als Liste an, die Sie mit den Pfeiltasten auswählen und mit der übernehmen. In Editoren öffnet sich ein IntelliSense-Menü.

Tipp

Bei der Autovervollständigung über gilt die »Dreierregel«: Geben Sie mindestens drei Zeichen ein, bevor Sie drücken. Bei PowerShell-Befehlen geben Sie mindestens den ersten Namensteil, den Bindestrich und dann drei Zeichen ein. Andernfalls gibt es zu viele infrage kommende Möglichkeiten, und muss viel zu oft gedrückt werden, bis das richtige Ergebnis vorgeschlagen wird.

Die Autovervollständigung dient nicht nur der Bequemlichkeit. Sie vermeidet auch Tippfehler und macht sie deutlich. Liefert zum Beispiel gar kein Resultat, liegt der Verdacht nahe, dass Sie sich bei Ihrer vorhandenen Eingabe bereits vertippt haben. Überprüfen Sie in diesem Fall, was Sie bisher eingegeben haben, und korrigieren Sie die Eingabe falls nötig. Danach versuchen Sie es noch einmal mit .

Geben Sie zum Beispiel Folgendes ein und drücken Sie dann + :

PS> Get-Pr +

Es erscheint nun das Auswahlmenü der noch infrage kommenden Befehle, aus denen Sie sich per Pfeiltasten einen aussuchen können (siehe Abbildung 1.13).

Abbildung 1.13: Die Konsole kann Eingaben mithilfe des Auswahlmenüs vervollständigen.

Kommen zu viele Alternativen infrage, fragt PowerShell gegebenenfalls nach, ob Sie wirklich alle Vervollständigungsmöglichkeiten sehen wollen.

Hinweis

Zuständig für diesen Service sowie die Farbcodierung der Eingabe ist die PowerShell-Erweiterung PSReadLine, die Teil von Windows PowerShell und PowerShell ist.

Falls Ihre Konsole also auf + nicht reagiert, ist diese Erweiterung möglicherweise nicht installiert. Bei sehr alten Windows PowerShell-Versionen kann das der Fall sein.

Auch Pfadnamen kann PowerShell mit vervollständigen:

PS> C:\p

Wenn der Pfadname Sonderzeichen wie Leerzeichen oder Klammern enthält, stellt die Autovervollständigung ihn automatisch in Anführungszeichen und schreibt den sogenannten Call-Operator vor den Text (&). Mit diesem kann Text in Anführungszeichen so ausgeführt werden, als handele es sich dabei um einen Befehl.

Hier ein Beispiel: Im ersten Fall wird der Text »notepad« ausgegeben, im zweiten Fall der Befehl notepad ausgeführt:

PS> "notepad"

notepad

PS> & "notepad"

Befehlszeilen erneut verwenden

Auch die Befehlshistorie spart Tipparbeit. Oft sitzt der erste eingegebene Befehl nicht auf Anhieb richtig, und Sie erhalten eine Fehlermeldung, oder der Befehl macht (noch) nicht das, was Sie sich eigentlich vorgestellt haben. Wenn Sie an Ihrem Befehl ein wenig feilen und ihn verbessern wollen, brauchen Sie ihn nicht komplett neu einzugeben.

Drücken Sie stattdessen , um den zuletzt eingegebenen Befehl zurückzuholen. Danach können Sie diesen Befehl verändern oder verbessern, bevor Sie ihn mit erneut an Power-Shell senden. Drücken Sie mehrmals, wenn Sie vorvorherige oder noch ältere Eingaben erneut verwenden wollen. Mit wandern Sie in der Liste wieder nach unten.

Groß- und Kleinschreibung

PowerShell verzichtet so weit wie möglich darauf, Groß- und Kleinschreibung zu unterscheiden. Diese ist zum Beispiel bei Befehlen, Variablennamen, Sprachelementen und Parametern immer egal.

Anders sieht es nur bei Argumenten aus, also den Informationen, die Sie einem Befehl mitgeben. Bei manchen Argumenten ist klar, dass Groß- und Kleinschreibung einen Unterschied machen, zum Beispiel bei Kennwörtern. Bei anderen Argumenten kann es auch vom Betriebssystem abhängen: Bei Windows ist die Groß- und Kleinschreibung bei Pfadnamen egal, bei Linux aber wichtig.

Unvollständige und mehrzeilige Eingaben

Ist eine Eingabe nicht komplett, weil zum Beispiel ein geöffnetes Anführungszeichen noch nicht geschlossen oder eine geöffnete Klammer nicht mit der korrespondierenden schließenden Klammer versehen wurde, führt die Eingabe nicht aus, sondern bricht nur die Zeile um. Die Konsole zeigt dann am Anfang der neuen Zeile >> an und ist bereit für mehr. So lassen sich zum Beispiel mehrzeilige Texte und kleine Skripte erfassen:

"Hallo

>> Dies ist mein kleines Tagebuch. >>

Ich schreibe jetzt einen mehrseitigen Text.

>> Das geht so lange, bis ich die Lust verliere."

>>

Hallo

Dies ist mein kleines Tagebuch.

Ich schreibe jetzt einen mehrseitigen Text.

Das geht so lange, bis ich die Lust verliere.

Erst wenn Sie das Abschlusszeichen eingeben (und dann noch zweimal drücken), akzeptiert PowerShell die mehrzeilige Eingabe. War alles ein Versehen, brechen Sie mit + ab. Danach drücken Sie auf , um die letzte Eingabe zurückzubekommen.

PowerShell-Hilfe aus dem Internet nachladen

PowerShell und seine Cmdlets sind gut dokumentiert, allerdings müssen die Hilfetexte für PowerShell (einmalig) mit Update-Help aus dem Internet nachgeladen werden.

Leider speichert Windows PowerShell seine Hilfedateien im Windows-Ordner, und der darf nur von Administratoren geändert werden. Deshalb kann die PowerShell-Hilfe nur aktualisiert werden, wenn Sie den folgenden Befehl mit vollen Administratorrechten ausführen (und über eine Internetverbindung verfügen):

PS> Update-Help -UICulture En-US -Force

Bei PowerShell dagegen unterstützt Update-Help neuerdings den Parameter -Scope, mit dem Sie festlegen, ob die Hilfe für alle Anwender (mit Administratorrechten) oder nur für den aktuellen Anwender (ohne Administratorrechte) installiert werden soll:

PS> Update-Help -UICulture en-us -Force -Scope CurrentUser

Achtung

Windows PowerShell und PowerShell speichern die Hilfedateien an unterschiedlichen Orten, sodass Sie den Befehl Update-Help in beiden PowerShell-Konsolen ausführen müssen, wenn Sie Windows Power-Shell und PowerShell parallel verwenden.

Es ist übrigens völlig normal, wenn Update-Help am Schluss eine rote Fehlermeldung ausgibt. Üblicherweise beschwert sich die Meldung bloß darüber, dass für einige (wenige) PowerShell-Module keine Hilfe gefunden wurde. Das ist normal.

Auch wenn Sie noch nicht wissen, was Module eigentlich sind: Es gibt eine Menge davon. Wenn eine Handvoll Module keine Hilfe anbieten, ist das nicht schlimm.

PS> (Get-Module -ListAvailable).Count

97

Ab sofort erhalten Sie mit Get-Help ausführliche Hilfestellung zu PowerShell-Befehlen. Ohne Update-Help hätte die Hilfe keine Beispiele und Beschreibungen enthalten:

PS> Get-Help -Name Get-Service -ShowWindow

Abbildung 1.14: Hilfe zu PowerShell-Befehlen in einem Extrafenster anzeigen

Achtung

Grafische Oberflächen (wie das Hilfefenster in Abbildung 1.14) stehen derzeit lediglich in Windows zur Verfügung. In anderen Betriebssystemen wie z. B. Linux funktionieren solche Befehle nur eingeschränkt oder gar nicht.

Rufen Sie hier beispielsweise den Befehl Get-Help mit dem Parameter -Full anstelle von -ShowWindow auf. Die Hilfe erscheint dann direkt in der Konsole.

Skriptausführung erlauben

Interaktive Befehle dürfen Sie in PowerShell jederzeit ausführen. Skripte, also Dateien mit der Erweiterung .ps1, sind anfangs allerdings verboten.

Das ist natürlich Unsinn, weil sich so PowerShell kaum nutzen lässt, und Sie müssen diese Sperre unbedingt sofort aufheben. Selbst wenn Sie gar nicht planen, eigene Skripte zu schreiben, nutzen viele PowerShell-Befehlserweiterungen intern Skripte und funktionieren nicht, solange die Skriptausführung verboten ist.

Ob Skripte erlaubt sind, bestimmt die sogenannte ExecutionPolicy. Set-ExecutionPolicy kann die Einstellungen ändern. Der folgende Befehl erlaubt dem aktuellen Benutzer, künftig lokale Skripte auszuführen. Skripte, die aus dem Internet heruntergeladen wurden, bleiben allerdings gesperrt:

PS> Set-ExecutionPolicy –Scope CurrentUser –ExecutionPolicy RemoteSigned –Force

Die gewählte Einstellung RemoteSigned ist zugegebenermaßen alles andere als intuitiv, denn was haben »Remote« und »Signed« miteinander zu tun? Tabelle 1.1 erklärt die möglichen Einstellungen deshalb etwas genauer.

Einstellung

Bedeutung

RemoteSigned

Lokale Skripte sind erlaubt. Skripte, die aus dem Internet heruntergeladen wurden oder auf Computern lagern, die nicht zur Domäne gehören, sind verboten. Sie können nur durch eine gültige digitale Signatur am Ende des Skriptcodes individuell erlaubt werden. Dies ist die empfohlene Einstellung für normale Anwender.

Bypass

Alle Skripte sind erlaubt. Dies ist die empfohlene Einstellung für Administratoren und versierte Anwender, weil sie auch die unbeaufsichtigte Ausführung erlaubt und diese Anwendergruppe selbst entscheiden kann, ob ein Skript legitim ist oder nicht.

Unrestricted

Alle Skripte sind erlaubt, aber wenn die Skripte nicht lokal gespeichert sind oder aus dem Internet heruntergeladen wurden, erfolgt vor der Ausführung eine Sicherheitsabfrage.

Undefined

Es wird keine Festlegung vorgenommen. Die nächstniedrigere Einstellung wird zurate gezogen. Wenn alle Einstellungen auf Undefined stehen, wird die Einstellungen auf Undefined stehen, wird die Einstellung Restricted aktiviert, und die Ausführung von Skripten ist verboten. Dies ist die Grundeinstellung.

Restricted

Die Skriptausführung ist verboten.

AllSigned

Alle Skripte müssen digital signiert sein. In der Praxis wirkt diese Einstellung ähnlich wie Restricted, weil Skripte typischerweise nie signiert sind.

Tabelle 1.1: Skriptausführungsrichtlinien

Ob die gerade geänderte neue Einstellung auch tatsächlich wirksam geworden ist, verrät GetExecutionPolicy.

PS> Get-ExecutionPolicy

RemoteSigned

Falls hier nicht die gleiche Einstellung genannt wird, die Sie gerade gesetzt haben, schauen Sie genauer nach, wer dazwischenfunkt: Es gibt nämlich mehrere Stellen, an denen diese Einstellung gesetzt werden kann:

PS> Get-ExecutionPolicy –List

Scope ExecutionPolicy

----- ---------------

MachinePolicy Undefined

UserPolicy Undefined

Process Undefined

CurrentUser RemoteSigned

LocalMachine Undefined

PowerShell bestimmt die effektive Einstellung, indem es die fünf Richtlinien von oben nach unten prüft. Die erste Einstellung, die nicht Undefined lautet, wird wirksam. Sind alle Einstellungen auf Undefined gesetzt, wird die Skriptausführung verboten. Das ist der Ausgangszustand der PowerShell.

Besonderes Augenmerk verdienen die ersten beiden Richtlinien: MachinePolicy und UserPolicy werden zentral über Gruppenrichtlinien festgelegt. Sie können diese Einstellungen nicht manuell ändern. Da es die obersten beiden Einstellungen sind, haben sie Vorrang vor allen übrigen. Wenn an diesen obersten beiden Stellen also Vorgaben zu sehen sind, können Sie zwar darunter eigene Einstellungen treffen, doch werden diese niemals wirksam.

Es ist ein Fehler – häufig auf einem Missverständnis beruhend –, wenn in MachinePolicy und/oder UserPolicy etwas anderes eingestellt ist als Undefined. In diesem Fall zwingt man die Einstellung nämlich allen Anwendern unwiderruflich auf. Stattdessen sollte man sie höchstens vorschlagen: Eine Gruppenrichtlinie sollte allenfalls einen Standardwert wie RemoteSigned für die Einstellung LocalMachine hinterlegen. Diese Einstellung würde dann für alle Anwender gelten, solange sie selbst keine andere Einstellung wählen.

Wer die ExecutionPolicy zwingend vorschreiben will, unterliegt dem Irrglauben, es wäre ein Schutzschild gegen Angreifer. Das stimmt aber nicht. Es ist lediglich eine benutzerspezifische Präferenz, die unerfahrene Anwender schützen soll, unkritisch Skripte aus zweifelhaften Quellen zu starten. Angreifer können diese Einstellung auf mannigfaltige Weise umgehen.

Weitere PowerShell-Einschränkungen

In Unternehmen sollen Macht und Missbrauchspotenzial der PowerShell mitunter eingeschränkt werden. Ob Sie solchen Einschränkungen augenblicklich unterliegen, findet der folgende Befehl für Sie heraus:

PS> $ExecutionContext.SessionState.LanguageMode

FullLanguage

Wenn der LanguageMode auf FullLanguage eingestellt ist, stehen Ihnen alle PowerShell-Funktionalitäten zur Verfügung. Wird hier hingegen ConstrainedMode angezeigt, wird Ihr System von Sicherheitssoftware wie Windows Defender Application Control, Software Restriction Policy, AppLocker oder einfachen Gruppenrichtlinien eingeschränkt.

Der Hauptzweck des ConstrainedMode ist, die PowerShell auf offizielle Befehle zu beschränken und zu verhindern, dass PowerShell allzu kreativ direkt auf Systembibliotheken des .NET Framework zugreift.

Wenn Sie mögen, können Sie eine PowerShell-Instanz testweise manuell in den eingeschränkten ConstrainedMode schalten, der dann allerdings für die gesamte weitere Laufzeit dieser Power-Shell-Sitzung gilt (also bis Sie sie schließen).

Sobald der Modus aktiv ist, dürfen nur noch Befehle ausgeführt werden, aber keine direkten Zugriffe auf das .NET Framework:

Welche umfangreichen Einschränkungen im ConstrainedMode