Grundlagen für die DevOps-Welt – Teil 1

PowerShell für .NET-Entwickler
Kommentare

Für viele .NET-Entwickler ist die PowerShell noch immer ein Buch mit sieben Siegeln und wird oft in die Sysadmin-Ecke verstoßen. Schade eigentlich, denn die PowerShell hat das Potenzial, den Entwickleralltag um einiges produktiver und angenehmer zu gestalten. Welche Vorteile die PowerShell mit sich bringt, zeigt diese Artikelserie. Im ersten Teil gibt es eine kurze Einführung in PowerShell sowie einen ersten Einblick in Cmdlets.

Mal schnell sieben Frontend-Webserver neustarten? Eine virtuelle Maschine in Azure hochfahren? Aus den Services im Backend eine HTML-Datei generieren? Ein Back-up einer SQL-Server-Datenbank erstellen? Auf der Webserverfarm einen neuen Application Pool einrichten? Mit dem wachsenden DevOps-Bedürfnis, welches nach dem Verschmelzen von Entwicklung und Betrieb strebt, wird die PowerShell in Zukunft auch für Entwickler stark an Bedeutung gewinnen. Diese Artikelserie wird Entwickler Schritt für Schritt an die PowerShell heranführen und erklären, wie man diese in den DevOps-Alltag integrieren kann. Dazu werfen wir im ersten Teil zuerst einen Blick auf die PowerShell-Grundlagen und geben eine Einführung in Cmdlets. Daraufhin behandelt der zweite Teil die Bearbeitung und Weiterverarbeitung von Cmdlet-Ergebnissen; der dritte und letzte Teil behandelt dann Praxisbeispiele aus dem DevOps-Alltag.

Artikelserie
Teil 1: PowerShell-Grundlagen: Hilfe, wie geht’s los?
Teil 2: PowerShell-Grundlagen: Bearbeitung und Weiterverarbeitung von Cmdlet-Ergebnissen
Teil 3: Praxisbeispiele aus dem DevOps-Alltag

Die PowerShell ist ein Kommandozeileninterpreter für Windows und kann als Alternative zur klassischen Kommandozeile (cmd.exe) betrachtet werden. Seit Windows 7 ist die PowerShell fester Bestandteil des Windows-Betriebssystems. Es geht aber noch besser: In den letzten Jahren hat sich die PowerShell zum Werkzeug der Wahl für die Administration des Betriebssystems und einer Vielzahl von Windows-Produkten und -Anwendungen etabliert. In Folge dessen bringen Produkte wie Team Foundation Server, SQL Server, Exchange Server, BizTalk, SharePoint, IIS, System Center Operations Manager, Microsoft Azure und viele weitere ihre eigenen PowerShell-Skripte bereits mit. Eine umfassende Beschreibung der PowerShell gibt es in Wikipedia, eine gute Einführung bietet das kostenfreie E-Book von Keith Hill (in Englisch). Weitere Informationen sowie vorgefertigte PowerShell-Skripte gibt es auf der offiziellen PowerShell-Seite und in der PowerShell Gallery.

Die Möglichkeiten der PowerShell sind beinahe unbegrenzt. Da die PowerShell objektorientiert arbeitet und auf dem .NET Framework basiert, kann die Funktionalität aus sämtlichen .NET-Klassen direkt aus der Shell benutzt werden. Neben .NET bietet die PowerShell Schnittstellen zur Windows Management Instrumentation (WMI) und dem Component Object Model (COM). Weiter kann über so genannte PowerShell-Provider auf das Dateisystem, den Zertifikat-Store oder die Registry zugegriffen werden. Die entsprechenden Berechtigungen vorausgesetzt können PowerShell-Befehle auch auf Remote-Maschinen ausgeführt werden, ohne dass zuvor eine Remote-Desktop-Verbindung aufgebaut werden muss.

Hilfe, wie gehts los?

Bevor es um die Syntax der PowerShell geht, soll aufgezeigt werden, wie man sich helfen kann, wenn mal nichts mehr geht. Der wichtigste Befehl ist Get-Help. Get-Help erklärt, wie die Hilfefunktion in PowerShell benutzt werden kann. Da die PowerShell ohne Hilfedateien ausgeliefert wird, muss mit Update-Help die aktuellste Version der Hilfe auf den lokalen Rechner heruntergeladen oder auf die Onlineseiten ausgewichen werden.

Die Kombination von Get-Help mit einem Befehl, in PowerShell-Sprache Commandlet oder Cmdlet genannt, erklärt dessen Verwendung. Get-Help Get-Process beispielsweise zeigt die Hilfeseite von Get-Process inklusive Syntaxbeispielen und Kommentaren an. Die erweiterte Hilfeseite kann mit dem Befehl Get-Help Get-Process –Detailed abgerufen werden. Mit Get-Help Get-Process –Online wird die Onlinehilfeseite aus Technet geöffnet, die neben den Grundlagen auch viele Anwendungsbeispiele enthält.

Mit dem Cmdlet Get-Command lässt sich herausfinden, welche Cmdlets überhaupt vorhanden sind. Dabei kann mit Wildcards, wie dem Stern *, gearbeitet werden. Der Befehl Get-Command *AppPool* listet alle Cmdlets auf, die mit dem IIS Application Pool zu tun haben (Listing 1). Als Alternative zu Get-Command kann auch die PowerShell-Skripting-Umgebung Integrated Scripting Environment (ISE) benutzt werden, die eine Suchfunktion für Cmdlets zur Verfügung stellt (Kasten: „PowerShell.exe und das Integrated Scripting Environment (ISE)“).

Listing 1: Suche nach Cmdlets

PS C:\> Get-Command *AppPool*

CommandType Name              Version Source

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

Cmdlet     Get-IISAppPool     1.0.0.0 IISAdministration

Cmdlet     Get-WebAppPoolState 1.0.0.0 WebAdministration

Cmdlet     New-WebAppPool     1.0.0.0 WebAdministration

Cmdlet     Remove-WebAppPool   1.0.0.0 WebAdministration

Cmdlet     Restart-WebAppPool 1.0.0.0 WebAdministration

Cmdlet     Start-WebAppPool   1.0.0.0 WebAdministration

Cmdlet     Stop-WebAppPool     1.0.0.0 WebAdministration

An dieser Stelle ist es Zeit für zwei besonders hilfreiche Funktionen für den PowerShell-Einsteiger. Mit Get-Help Get-Process –ShowWindorw wird die Hilfeseite in einem zusätzlichen Fenster geöffnet und kann so neben dem PowerShell-Fenster gelesen werden, während in der Eingabeaufforderung die Befehle ausprobiert werden.

Der zweite Tipp ist der Show-Command-Befehl. Angenommen, es soll ein kompliziertes Cmdlet mit vielen Parametern wie New-AzureVM ausgeführt werden. Wird das Cmdlet ohne Parameter ausgeführt, werden die zwingend erforderlichen Parameter abgefragt. Alternativ dazu kann mit Show-Command New-AzureVM ein Fenster geöffnet werden, das für jeden Parameter ein Eingabefeld anzeigt (Abb. 1). Nachdem die Parameter eingetragen sind, kann der Befehl entweder direkt ausgeführt oder in die Zwischenablage kopiert werden.

Gewisse Cmdlets unterstützen auch die beiden Schalter -WhatIf und -Confirm. Mit dem WhatIf-Parameter kann abgefragt werden, was bei der Ausführung des Befehls passiert, ohne dass dieser ausgeführt wird. Mit -Confirm wird die Shell angewiesen, vor der Ausführung vom Benutzer eine Bestätigung zu verlangen.

Abb. 1: Das Show-Command-Fenster

Abb. 1: Das Show-Command-Fenster

PowerShell.exe und das Integrated Scripting Environment (ISE)

Unter Windows gibt es zwei eingebaute Tools, die PowerShell-Code ausführen können. Einerseits natürlich die klassische PowerShell.exe, auf der anderen Seite das Integrated Scripting Environment oder kurz ISE.

Die Eingabeaufforderung PowerShell.exe eignet sich besonders dazu, einzelne Cmdlets aufzurufen. Für komplexere Aufrufe oder das Schreiben von Skripten ist die ISE angenehmer. Unter anderem lassen sich in der ISE mehrere Dateien öffnen, und der Entwickler wird mit Intellisense und Funktionen zum Skript-Debugging unterstützt.

Neben unzähligen kostenfreien und kostenpflichtigen Anwendungen für die Entwicklung von PowerShell-Skripten gibt es auch die Möglichkeit, in Visual Studio PowerShell-Code zu schreiben. Es sei dafür auf die „PowerShell Tools for Visual Studio 2015“ verwiesen.

Cmdlets

Wie erwähnt werden Skripte in PowerShell als Cmdlet (sprich: Commandlet) bezeichnet. Sie folgen einer Verb-Nomen-Struktur. Beispiele dafür sind Get-Help, Get-Process, Move-Item, Restart-Computer oder Add-Alias. Mit der Tabulatortaste können die Cmdlet-Namen vervollständigt werden. Wird zum Beispiel Get-Pro eingegeben und die Tabulatortaste gedrückt, dann vervollständigt sich das Cmdlet zu Get-Process.

Um die Tipparbeit weiter zu erleichtern, sind für viele Cmdlets Shortcuts definiert. Wenn mit dem Befehl Get-Help Get-Process die Hilfeseite für das Get-Process Cmdlet aufgerufen wird, ist unter der Überschrift ALIASES ersichtlich, dass das Cmdlet Get-Process ebenfalls mit dem Alias gps oder sogar nur ps aufgerufen werden kann.

Das Cmdlet Get-Command listet alle auf dem System verfügbaren Cmdlets auf. Get-Command gibt alle Cmdlets als Liste aus, was ohne Filterung wenig sinnvoll ist. Filter werden in den folgenden Abschnitten genauer erläutert. Ein praktischer Trick ist, dass mit dem Cmdlet Out-Host und dem Parameter -Paging eine seitenweise Ausgabe erzielt werden kann. Mit der Eingabetaste kann zeilenweise und mit der Leertaste seitenweise fortgefahren werden. Der vollständige Befehl sieht so aus: Get-Command | Out-Host –Paging. Der Pipe-Operator | wird im folgenden Abschnitt vorgestellt.

Pipelines

Pipelines werden verwendet, um die Ausgabe eines Cmdlet A als Eingabe an ein weiteres Cmdlet B zu übergeben. Dazu werden zwei Cmdlets durch den Pipe-Operator | miteinander verbunden. Als Beispiel sollen die fünf größten Dateien aus einem Verzeichnis absteigend sortiert aufgelistet werden. Dazu werden als Erstes mit Get-ChildItem D:\__Temp –Recurse die Dateien geladen und danach mit Sort-Object Length –Descending absteigend sortiert. Zum Schluss werden mit Select-Object Fullname, Length –First 5 der Name und die Größe ausgewählt und das Resultat auf die Top 5 eingeschränkt. Die drei Befehle können mit dem Pipe-Operator verbunden werden (Listing 2).

Listing 2: Der Pipeline-Operator

PS: C:\> Get-ChildItem D:\__TEMP -Recurse | Sort-Object Length -Descending | Select-Object Fullname, Length -First 5

FullName                                           Length

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

D:\__TEMP\orchard\1246_glimpsev2.mp3             57537015

D:\__TEMP\orchard\1237_githubfundamentals.mp3   56979039

D:\__TEMP\orchard\1252_numl.mp3                 56507999

D:\__TEMP\orchard\1242_messaging.mp3             56176140

D:\__TEMP\orchard\1253_onboarding_is_culture.mp3 53080948

Als Beispiel für die Abkürzung von Cmdlets mithilfe der Alias-Funktion aus dem letzten Abschnitt kann der Befehl folgendermassen verkürzt werden:

PS: C:\> gci D:\__TEMP -r | sort Length -d | select Fullname, Length -f 5

Zugegeben, dem PowerShell-Neuling mag diese Schreibweise etwas kryptisch vorkommen, mit ein wenig Übung lassen sich aber auch derart abgekürzte Befehle gut lesen.

Objekte

Da die PowerShell auf dem .NET Framework basiert, arbeitet sie durchgehend mit Objekten. Jedes Resultat eines ausgeführten Cmdlets ist ein Objekt, also eine Instanz einer .NET-Klasse oder einer .NET-Collection. Somit kann mit der bekannten Punktnotation auf Members des Objekts, wie Properties oder Methoden, zugegriffen werden. Dass die PowerShell mit Objekten arbeitet, erhöht den Bedienungskomfort erheblich. In anderen, textbasierten Shells fällt viel Aufwand für das Parsen und Manipulieren von Text an, der in der PowerShell wegfällt. Am Beispiel von Get-Date ist sehr gut ersichtlich, was es mit den Objekten an sich hat. Das Cmdlet Get-Date gibt, wie zu erwarten, das aktuelle Datum zurück:

PS: C:\> Get-Date

Freitag, 12. Februar 2016 21:38:41

Mithilfe des Cmdlets Get-Member lässt sich das Resultatobjekt von Get-Date untersuchen. Es werden die Members, das heißt Methoden und Properties, angezeigt. Das Datum, das Get-Date zurückgibt, wird über den Pipe-Operator an das Get-Member Cmdlet weitergereicht (Listing 3).

Listing 3: Die PowerShell arbeitet mit Objekten

PS: C:\> Get-Date | Get-Member

TypeName: System.DateTime

Name                 MemberType     Definition

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

Add                 Method         datetime Add(timespan value)

AddDays             Method         datetime AddDays(double value)

AddHours             Method         datetime AddHours(double value)

AddMilliseconds     Method         datetime AddMilliseconds(double value)

AddMinutes           Method         datetime AddMinutes(double value)

…

Dem aufmerksamen Leser wird sofort auffallen, dass es sich um die bekannten Add-Methoden aus dem Struct System.DateTime des .NET Frameworks handelt. Auf die Member unseres Datums kann analog zu .NET mit der Punktnotation zugegriffen werden. Dafür muss der Aufruf von Get-Date in runde Klammern gesetzt werden:

PS: C:\> (Get-Date).DayOfWeek

Friday


PS: C:\> (Get-Date).ToShortDateString()

12.02.2016

Im zweiten Teil der Artikelserie befassen wir uns mit der Bearbeitung und Weiterverarbeitung von Cmdlet-Ergebnissen.

Windows Developer

Windows DeveloperDieser Artikel ist im Windows Developer erschienen. Windows Developer informiert umfassend und herstellerneutral über neue Trends und Möglichkeiten der Software- und Systementwicklung rund um Microsoft-Technologien.

Natürlich können Sie den Windows Developer über den entwickler.kiosk auch digital im Browser oder auf Ihren Android- und iOS-Devices lesen. In unserem Shop ist der Windows Developer ferner im Abonnement oder als Einzelheft erhältlich.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -