Archiv für den Monat: August 2020

Die ersten Schritte mit den neuen PowerShell-Notebooks

Notebooks sind eine interessante Alternative zu den bekannten Benutzeroberflächen, in dem sie das Zusammenstellen von Texten (in der Regel im Markdown-Format), Grafiken und ausführbarem Programmcode kombinieren.

Ein Notebook ist damit ein interaktives Dokument, in dem beliebige statische Daten mit dynamisch generierten Daten beliebig kombiniert werden. Die dynamisch generierten Daten werden mit den Befehlen einer Programmiersprache erzeugt sobald die Befehlsfolge vom Anwender ausgeführt wird. Der Begriff „interaktives Notizblatt“ gibt für mich Funktion und Aufgabe eines solchen Notebook sehr gut wieder.

Notebooks werden seit einigen Jahren im Bereich der Datenanalyse (z.B. im Rahmen des Jupyter-Projekts und der dahinterstehenden Plattform jupyterlab.com) und im wissenschaftlichen Bereich eingesetzt (im Jahr 2016 wurden einige der Datensätze, mit deren Hilfe Wissenschaftlern der erste Nachweis von Gravitationswellen gelungen war, über ein Jupyter-Notebook der Allgemeinheit zur Verfügung gestellt, so dass theroretisch jeder Interessierte die Datenauswertung selber nachvollziehen kann).

Ein Wikipedia-Eintrag beschreibt das Jupyter-Projekt sehr gut.

https://de.wikipedia.org/wiki/Project_Jupyter

Darüber hinaus gibt es natürlich jede Menge Webseiten, auf denen der Umgang mit Juypter-Notebooks anschaulich beschrieben wird. Alles ist kostenlos, da die Software Open Source ist (und auch lokal installiert werden kann).

Inzwischen hat auch Microsoft das Thema für sich entdeckt und bietet Notebooks seit einiger Zeit im Rahmen ihrer Azure-Platform für das interaktive Auswerten von im Rahmen des Monitoring erfassten Performance-Daten an. Darüber hinaus gibt es auf der Grundlage von .NET Interactive eine Erweiterung für Jupyter, die neben der interaktiven Ausführung von C#-Code auch die Ausführung von PowerShell-Code in einem Jupyter-Notebook ermöglicht. Einen zwingenden Grund PowerShell anstelle von Python zu verwenden sehe ich zwar nicht, aber es ist trotzdem natürlich schön, dass so etwas berhaupt möglich ist.

Das Ganze Thema ist aber im Moment noch sehr speziell und setzt eine umfangreiche „Installationsorgie“ von .NET Core, .NET Interactive, Python, Juypyter und eventuell weiterem Zubehör voraus. So interessant diese Technik auch sein mag, für den typischen „PowerShell-Admin“ kommt sie nicht in Frage.

Sehr viel interessanter ist dagegen eine Erweiterung der PowerShell Extensions für Visual Code, über sich (einfache) PowerShell-Notebooks in Visual Studio Code erstellen und anzeigen lassen. Das Besondere daran ist, dass PowerShell-Notebooks auf regulären Ps1-Dateien basieren und daher natürlich auch in der Konsole oder der ISE ausgeführt werden können – dann werden sie natürlich als Skripte angezeigt. Wie auch sonst.

Doch warum sollte man das tun? Ein PowerShell-Notebook ist immer dann interessant, wenn man beliebige Befehlsfolgen mit (formatierten) Texten kombinieren und dem Anwender die Ausführung der Befehsfolgen in einer beliebiger Reihenfolge ermöglichen möchte. In der Vergangenheit musste man jeweils einen Block in einem Skript markieren und mit [F8] ausführen. Dieselbe Befehlsfolge als Teil einer Zelle eines Notebooks ist eine „visuelle Insel“ und damit besser als solche erkennbar. Auch das Ausführen über einen eigenen Button ist komfortabler. Schritt für Schritt-Anleitungen und Material für Schulungen fallen mir spontan ein, es gibt sicher noch weitere Anwendungsfälle.

Wer das Ganze selber ausprobieren möchte, muss Stand August 2020 noch zwei Besonderheiten beachten, die in ein paar Wochen keine Rolle mehr spielen werden:

  1. Es funktioniert nur mit der Insider Version von VIsual Studio Code, die einen eigenen Download darstellt (dieser kann aber problemlos zur regulären Visual Code-Installation installiert werden – das Produkticon ist grün und nicht blau).
  2. Es setzt die aktuellste Version der PowerShell-Extension voraus (ab Version v2020.7.0 – mit älteren Versionen funktioniert es nicht).

Ob alle Voraussetzungen erfüllt sind erkennt man ledlgich an einem unscheinbaren Button am rechten Rand der Bereichsleiste mit dem zwischen Code- und Notebook-Ansicht umgeschaltet wird.

.

Abb. Über einen Button wird zwischen Notebook- und Code-Ansicht umgesschaltet

Außerdem muss die Umschaltoption in den Einstellungen zu den PowerShell Extensions aktiviert werden.

Abb. Damit der Toggle Button sichtbar ist, muss eine EInstellung gesetztt sein.

Ein Notebook besteht aus Zellen. Eine Zelle enthält entweder (beliebigen) Text oder ausführbare Befehle. Auch wenn es naheliegend ist, den Text mit Markdown auszuzeichnen, damit z.B. eine Überschift als solche formatiert ausgegeben wird, eine Voraussetzung ist das natürlich nicht.

Das Besondere an einem PowerShell-Notebook ist, dass es eine reguläre Ps1-Datei ist, die daher auch wie jede andere Ps1-Datei ausgeführt wird. In diesem Fall spielt der enthaltene Text keine Rolle, da es lediglich Kommentare sind. Lediglich in der Notebook-Ansicht in Visual Studio Code wird der MarkDown-Text „gerendert“ und formatiert angezeigt.

Abb. Ein PowerShell-Notebook fasst formatierten Text und ausführbare Befehle in Zellen auf einer Seite zusammen

Den Komfort eines Jupyter-Notebooks gibt es daher im Moment noch nicht (eventuell ist das geplant), was auch daran deutlich wird, dass die Ausgaben einer „Zelle“ wie üblich im Konsolenfenster ausgegeben werden. Es wäre natürlich etwas schöner, wenn der Output unterhalb der Zelle erscheinen würde (was bei umfangreicherem Output natürlich auch nicht ganz optimal ist).

Auch wenn es am Ende (im Moment) nur um eine „Aufhübschung“ eines Skriptes und ein komfortableres Ausführen von Befehlsfolgen geht, sind die neuen PowerShell-Notebooks eine interessante und willkommene Erweiterung und Alternative, die ich in Zukunft (sofern sie ein offizeiller Teil von Visual Studio Code geworden sind) in meinen PowerShell-Schulungen einsetzen werde.

Ein Dank an das eine kleine Entwicklerteam der PowerShell Extensions, dass sie das Thema aufgegriffen (die Visual Studio Code-Entwickler stellen für die Implementierung von Notebooks Schnittstellen zur Verfügung) und bislang so gut umgesetzt haben.

Tipp des Tages: Befehlszeilentools mit –% ausführen

Hin und wieder kommt es vor, dass sich ein Befehlszeilentools nicht in der PowerShell-Konsole ausführen lässt. Der Grund dafür hat etwas mit der Art und Weise zu tun, wie das Befehlszeilentool seine Argumente verarbeitet, insbesondere was Anführungszeichen betrifft. Das klassissche Beispiel ist Find.

Der folgende Aufruf funktioniert nicht:

Abgesehen davon, dass es eigentlich keinen Grund für diesen Aufruf gibt, dürfte es zumindestens von theoretischem Interesse sein, warum bei diesem harmlosen Befehl ein „FIND: Parameterformat falsch“-Fehler die Folge ist.

Die Antwort: Die Anführungszeichen müssen escaped werden. Für diesen und möglichweisere andere solcher Spezialfälle bietet die PowerShell bereits seit der Version 3.0 (?) den praktischen Schalter –%, der einfach den Argumenten vorangestellt wird:

–% bewirkt, dass die PowerShell den folgeden Text nicht mehr selber interpretiert. Etwas einfacher geht es natürlich mit Where-Object bzw. einfach nur mit einem ?.