Archiv für den Monat: Oktober 2017

PowerShell unter Linux unter Windows (Linux-PowerShell ohne Linux VM)

Eine PowerShell unter Linux, die direkt unter Windows läuft? Dank dem relativ neuen Windows Subsystem for Linux ist das grundsätzlich alles kein Problem mehr. Zuerst muss das WSL installiert werden, das mit dem aktuellen Creators Fall Update von Windows 10 offiziell geworden ist (für Windows Server 2016 wird ein Update geben). Danach wird ein Linux aus dem Windows Store installiert, z.B. Ubuntu.

Wie das WSL installiert wird, beschreibe ich in einem anderen Blog-Eintrag: http://winhub.de/?p=154

Danach startet man die Bash und installiert die PowerShell für Linux genauso so wie es auf der GitHub-Projektseite z.B. für Ubuntu 16.04 beschrieben wird:

https://github.com/PowerShell/PowerShell/blob/master/docs/installation/linux.md#ubuntu-1604

Anschließend wird die PowerShell durch Eingabe von „powershell“ gestartet. Windows PowerShell und Linux PowerShell laufen damit parallel in zwei Fenstern. Einen zwingenden Anwendungsfall gibt es dafür natürlich nicht. Wer die beiden PowerShell-Varianten vergleichen oder sich in einer Linux-Umgebung bewegen könnte, kann dies jetzt sehr einfach tun, da keine VM mehr einrichtet werden muss – ressourcenschonender dürfte diese Variante daher auch sein.

Tipp: Json-Daten flexibel verarbeiten

Das JavaScript Object Notation-Format, kurz JSON, kommt immer mehr in Mode, da Webservice-Aufrufe auch im Admin-Alltag eine Rolle spielen.

Das folgende Beispiel ist aus der Notwendigkeit entstanden, den Inhalt einer JSON-Datei, die in einem Webverzeichnis liegt, verarbeiten zu müssen. Mehr oder weniger ad-hoc.

Die URL der Datei ist http://www.activetraining.de/Nanohub/Kurs1001.json.

Das Herunterladen erledigt Curl:

Hinter Curl steckt natürlich nicht das vielseitige Allround-Kommandozeilentool, sondern lediglich das Invoke-WebRequest-Cmdlet. Die Rückgabe ist daher nicht Text, sondern ein WebResponseObject-Objekt. Der heruntergeladene Inhalt steckt in der Content-Property, aber als Byte-Folge.

Gesucht ist daher eine „Trick“, um aus der Byte-Folge Text zu machen. Wer sich ein wenig mit .NET auskennt weiß, dass es dafür die Encoding-Klasse gibt, die verschiedene „Encoder“ über statische Properties zur Verfügung stellt. Eine gute Wahl ist immer der Default-Encoder. Ein wenig ungewöhnlich ist (jedenfalls für mich;), dass jede statische Encoder-Eigenschaft für ein Objekt steht. Unter anderem bietet jedes Objekt eine GetText-Methode, die eine Byte-Folge in einen Text umwandelt.

Der folgende Aufruf macht aus einer Byte-Folge daher Text:

Das Ganze soll allerdings in eine Function eingebaut werden, so dass sich der Byte-Inhalt direkt nach dem Aufruf von Curl in Text umwandeln lässt.

Auftritt PowerShell-Konsole und dem genialen PSReadLine-Modul, das ab Windows Server 2016 und Windows 10 bekanntlich fest dabei ist und ansonsten per Install-Module PSReadline -Force nachgeladen wird. Dank PSReadline ist es kein Problem, eine komplette Function-Definition in die Konsole einzugeben:

Das Beste daran ist, dass die komplette Function-Definition komfortabel editieren kann. Einfach per [Pfeil oben]-Taste und den üblichen Tasten für die Textbearbeitung. Einfach und genial.

Die Umwandlung des heruntergeladenen JSON in Objekte sieht damit wie folgt aus:

Dank PSReadline lassen sich auch Function-Definitionen in der Konsole komfortabel bearbeiten

Dank PSReadline lassen sich auch Function-Definitionen in der Konsole komfortabel bearbeiten