PowerShell für Developer

Das eigentliche Killer-Feature der PowerShell ist tatsächlich die konsequent durchgesetzte Objektorientierung. Es muss ja nicht unbedingt immer gleich ein ganzes Script sein. Oft genug genügen auch ein paar .NET Objekte, die man sich mit wenigen Zeilen Code/Command(let)s von der ersten Property bis zu letzten Methode zu Gemüte führen kann.
Ganz besonders reizvoll wird dies bei APIs von komplexen Systemen, wie z. B. Microsoft SharePoint, mit deren Hilfe man per PowerShell auf dem gesamten Objektmodell mit minimalem Aufwand lesen und manipulieren kann.

Wie im letzten PowerShell-Post, hier ein paar meiner Favoriten kurz und knapp zusammengetragen:

#1 Get-Member: Objekt-Analyse

Direkt an der Konsole fehlt üblicherweise IntelliSense. Da man Eigenschaften und öffentliche Methoden von Objekten selten alle im Kopf hat, ist Get-Member das aus meiner Sicht wichtigste Cmdlet der PowerShell – ganz besonders dann, wenn man etwas abseits der Cmdlets mit .NET Objekten arbeitet. Den Spickzettel zu jedem Objekt gibt’s auf Befehl (im Beispiel für ein System.IO.FileInfo-Objekt) per Get-Member.

dir | Get-Member

Fehlen Methoden oder Eigenschaften, kann man dem Cmdlet mit der Option -Force noch ein wenig mehr Informationen entlocken.

dir | Get-Member -Force

#2 Invoke-WebRequest: Daten aus dem Netz verwenden

Mit einem Web Request Daten aus dem Netz laden: Beim Entwickeln von Software vor allem dann populär, wenn es um das Ansprechen von Web-APIs geht. Im nachfolgenden Beispiel wollen wir ein Diablo III Spielerprofil via REST Webservice abrufen.

// Daten abrufen; vorerst "Plain" per .NET Klassenbibliothek und dem WebClient
(New-Object System.Net.WebClient).DownloadString("http://eu.battle.net/api/d3/profile/quatze-2409/")
// Ganz ähnlich aber viel kürzer geht es mit dem Invoke-WebRequest Cmdlet, welches mit PS 3.0 eingeführt wurde
Invoke-WebRequest http://eu.battle.net/api/d3/profile/quatze-2409/

Soweit so gut aber wirklich arbeiten kann man damit noch nicht, da wir lediglich die JSON-Struktur in einem String haben. Mehr dazu mit dem nächsten Cmdlet…

#3 ConvertFrom-Json: Rückgabe des REST Webservice verarbeiten

Um mit den aus #2 abgerufenen Informationen zu arbeiten, kann man den abgerufenen String umständlich von Hand parsen und zerschneiden oder man konvertiert ihn in ein .NET Objekt. Das Cmdlet ConvertFrom-Json bringt hierfür alles mit, was wir benötigen.

// Der vom REST Webservice abgerufene String wird an das Cmdlet ConvertFrom-Json übergeben, welches ein Custom Object erzeugt
Invoke-WebRequest http://eu.battle.net/api/d3/profile/quatze-2409/ | ConvertFrom-Json
// In einem Schritt und ohne explizites Konvertieren erzeugen wir mit dem Cmdlet Invoke-RestMethod das Custom Object, ...
$d3profile = Invoke-RestMethod http://eu.battle.net/api/d3/profile/quatze-2409/
// ...an welchem wir alle Helden nebst Primärattribute im Spielerprofil ausgeben lassen können
$d3profile.heroes | ft name, level, hardcore, gender, last-updated -AutoSize

#4 Range Operator

Es klingt profan aber die Idee dahinter spart Zeit und Code: Der Range-Operator der PowerShell zum einfachen Erzeugen von nummerischen Bereichen. Praktischer Nutzen? Kommt sofort…

// 1 bis 10 ausgeben; zugegeben - eher unspannend aber es erklärt die Funktionsweise
1..10

// Alles von A-Z; immer noch kein umwerfendes Feature aber durchaus praktisch
65..90 | % { [char]$_ }
// Ein Array mit 23 bis 42 initialisieren
$a = 23..42
$a.Length
// Drei mal gpupdate ausführen mit jeweils 10 Sekunden Pause
1..3 | % { gpupdate ; "Update #$_ $(Get-Date) done." ; Start-Sleep 60 }

#5 [] als Indexer

Nur der Vollständigkeit halber noch zu erwähnen: Zugriffe auf Collections und Arrays sind analog zur C#-Syntax möglich…

// Hier im Beispiel des Arrays aus #4
$a[5]

 

Mehr Informationen zur PowerShell und den Standard-Cmdlets aus dem Microsoft.PowerShell.Utility Modul findet man im TechNet.

Über Thomas Roschinsky
Software Engineer | .NET | SharePoint | Dynamics CRM | BI | C# | C/C++

One Response to PowerShell für Developer

  1. Pingback: Jahresrückblick 2014 | Thomas Roschinsky

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: