Archiv der Kategorie: Tipps

Tipp: Über die ISO-Datei an die Versionsnummer eines Windows-Image herankommen

Wer Windows 10 über das Media Creation Tool herunterlädt, erhält eine ISO-Datei mit dem unscheinbaren Namen Windows.iso. Nicht sehr aussagekräftig. Auch wenn man davon ausgehen darf, dass dies stets die aktuelleste offizielle Windows 10-Version ist, ein paar Wochen später ist das eventuell nicht mehr so eindeutig.

Natürlich kann man die Versionsnummer, zusammen mit vielen anderen Details, abfragen. Entweder per Dism.exe oder per Get-WindowsImage aus dem Dism-Modul.

Die PowerShell muss dazu als Administrator gestartet werden. Für beide Aufrufe wurde die Iso-Datei als Laufwerk gemounted. Dazu genügt ein Doppelklick auf die Datei.

oder

In beiden Fällen ist die Build-Nummer, z.B. 16299, Teil der Ausgabe.

Ein wenig kurios ist, dass der Index einmal 1 und einmal 7 ist, aber das wird schon seine Gründe haben;)

Aus aktuellem Anlass: Spectre und Meltdown-Check per PowerShell-Modul

Man glaubt zwar immer nach den „Skandalen“ der jüngsten Vergangenheit, dass es in Bezug auf Sicherheitslücken in IT-Systemen nicht schlimmer kommen kann, aber dann kommt es doch noch schlimmer. Ein Fehler auf der Ebene der CPU (Stichwort: „Speculative Execution side-channel attacks“), der Angreifern theoretisch einen Lesezugriff auf eigentlich geschützte Bereiche des Arbeitsspeichers ermöglicht, ist für mich ein Super-GAU. Da hilft auch alles Relativieren nichts. Auch wenn sich konkrete Schadensfälle in Grenzen halten werden, da weltweit die Mehrheit der Systeme in den nächsten Tagen ein Update erhält, ist die psychologische Auswirkung mehr als bedenklich.

Wozu sich noch um Sicherheitskonzepte, Benutzerkonten, Tokens und Claims Gedanken machen, wenn die komplette Sicherheit durch ein Einfallstor ausgehebelt wird, das in Zukunft immer wieder auftreten kann. Das ergibt sich aus der enormen Komplexität moderner CPUs. Hinzu kommt, dass der Fehler offenbar schon viele Jahre existierte und offenbar erst kurzem von einem Forscherteam der TU Graz entdeckt wurde als sie gehäuft aufgetretene Angriffsszenarien näher untersuchten.

Da über die Thematik in den letzten Tagen schon sehr viel geschrieben wurde, will ich nicht auch noch meinen Senf basierend auf Halbwissen und Vermutungen dazu geben. Auf Spiegel Online habe ich eine gute Zusammenfassung gefunden:

http://www.spiegel.de/netzwelt/gadgets/spectre-und-meltdown-die-wichtigsten-antworten-zu-den-schwachstellen-in-prozessoren-a-1186193.html

Ansonsten natürlich Heise-News mit einem ausführlichen und sehr lesenswerten Artikel von Andreas Stiller, Golem.de usw.

In ein paar Wochen dürfte das Thema ohnehin wieder vergessen sein. Wer macht sich denn aktuell noch über die Bedrohungen des letzten Jahres wie „WannaCry“ und die daraus eigentlich zu ziehenden Konsequenzen Gedanken? Bis zum nächsten Störfall will man vermutlich möglichst wenig Grundsätzliches in Frage stellen.

Wer testen möchte, ob eine CPU anfällig ist für Spectre und Meltdown kann ein PowerShell-Modul von Matt Miller von der PowerShell Gallery installieren, das Microsoft seit dem 4. Januar 2018 zur Verfügung stellt. Voraussetzung ist PowerShell ab Version 5.0. Und natürlich muss die Skriptausführung möglich sein. Wer sich bislang den Luxus gönnte mit einer älteren PowerShell-Version zu arbeiten, muss das Modul als Zip-Datei direkt von der Projektseite herunterladen, „entsperren“ und dann die beiden Dateien in ein in einem Modul-Verzeichnis zuvor angelegtem Verzeichnis mit dem Namen „SpeculationControl“ kopieren.

Eine Projektseite für das Windows 10-Modul habe ich leider nicht gefunden, in der TechNet Script Gallery gibt es das Modul für Windows Server 2016 als Download:

https://gallery.technet.microsoft.com/scriptcenter/Speculation-Control-e36f0050

Das Modul lässt sich natürlich auch unter Windows 10 verwenden.

Liegt PowerShell ab version 5.0 vor, genügt ein

Das Modul wird dadurch nach %userprofile%\documents\windowspowershell\modules kopiert, so dass die PowerShell nicht als Administrator gestartet werden muss.

Anschließend wird die einzige Function wie folgt aufgerufen:

(für VMWare ist offenbar ein Patch erforderlich: https://twitter.com/lamw/status/949662333038559232)

Die Ausgabe des Befehls ist relativ technisch und mit zahlreichen Fachbegriffen versehen, man muss sie daher interpretieren können. Vereinfacht gilt, dass ein „false“ schlecht, ein „true“ gut. Hat man die aktuellen Patches (vor allem KB4056892) installiert, sollte die Mehrheit der Einstellungen einen true-Wert besitzen.

Microsoft beschreibt die Ausgaben auf der folgenden Webseite:

https://support.microsoft.com/de-de/help/4073119/protect-against-speculative-execution-side-channel-vulnerabilities-in

Das von Microsoft zur Verfügung gestellte Sicherheitsupdate hat die Nummer KB4056892. Wie es aussieht, muss es aktuell (Stand: 9/1/2018) bei Windows 10 noch direkt geladen werden:

http://www.catalog.update.microsoft.com/Search.aspx?q=KB4056892

Damit ein Virenscanner das Update nicht verhindert, gibt es unter der folgenden Adresse eine Liste mit Problemlösungen bei den einzelnen Produkten:

https://docs.google.com/spreadsheets/d/184wcDt9I9TUNFFbsAVLpzAtckQxYiuirADzf3cL42FQ/htmlview?sle=true#gid=0

Wie die Meltdown-Abfrage remote ausgefürt wird, wird unter der folgenden Adresse ausführlich beschrieben:

https://blogs.technet.microsoft.com/ralphkyttle/2018/01/05/verifying-spectre-meltdown-protections-remotely/

Mit der Schadensbegrenzung dürften die zuständigen Admins ein paar Tage beschäftigt sein. Insofern hat das neue Jahr „vielversprechend“ begonnen;)

PowerShell-Experten-Tipp: Array-Eigenschaften in Klassen

Eigenschaften in per class-Befehl definierten Klassen können einen beliebigen Datentyp besitzen, natürlich auch Array bzw. den Datentyp für ein mehrdimensionales Array mit Werten eines wiederum beliebigen Typs. Die Schreibweise für den Datentyp ist dieselbe wie bei einer Variablendeklaration, also z.B. [Double[,]] für ein zweidimensionales Array mit Double-Werten.

Das folgende Beispiel ist abstrakt und dient lediglich dazu, die Syntax zu veranschaulichen.

Ausgangspunkt ist eine Klasse M. Sie besitzt eine Property Prop1.

Die zweite Klasse N> besitzt eine Array-Property mit Objekten vom Typ N.

Der Eigenschaft Werte werden direkte Werte zugewiesen, das Array muss also nicht initialisiert werden.

Soll eine Klasse eine Eigenschaft besitzen, die auf einem zweidimensionalen Array basiert, wird für Schreibweise des Datentyps die bei der PowerShell allgemein übliche Schreibweise verwendet.

Außerdem muss die Property explizit per New-Object initialisiert werden, da ansonsten das Array nicht angelegt wird.

Tipp: Die Anzahl der Dimensionen liefert die rank-Eigenschaft des Array. Über die Methode GetUpperBound() erhält man die Obergrenze für eine bestimmte Dimension (0, 1 usw.).

Functions wie Functions aufrufen – über einen kleinen Umweg kein Problem

Eine der Grundideen bei der Planung und Umsetzung der PowerShell war damals, dass sie ein möglichst breites „Publikum“ ansprechen soll, und dass niemand gezwungen werden sollte vertraute Gewohnheiten und Schreibweisen beim Scripten aufgeben zu müssen.

Eine der dieser Gewohnheiten ist die bei anderen Skript- und Programmiersprachen übliche Form der Function-Definition und des Aufrufs einer Function. Demnach folgen auf den Befehl, der die Function definiert, die Parameter in runden Klammern:

Beim Aufruf der Function werden die Argumente ebenfalls in runden Klammern gesetzt:

Auch in PowerShell können Functions auf diese Weise definiert und aufgerufen werden, wenngleich dies eher eine Ausnahme ist. Die einzige Einschränkung besteht darin, dass eine Übergabe mehrerer per Komma getrennter Werte wie üblich die Übergabe eines Arrays bedeutet. Werden daher mehrere Werte übergeben, müssen diese als Array angesprochen werden.

Das folgende Beispiel ist nicht nur etwas umfangreicher, es behandelt auch einen Bereich, der im IT-Alltag eher selten vorkommt: Es geht um die Berechnung der Determinante von Vektoren mit zwei Komponenten und anderen Dingen, die etwas mit „analytischer Geometrie“ (aber eher auf dem Niveau des 11. Schuljahres) zu tun haben.

Im ersten Schritt werden lediglich zwei Klassen für Vektoren mit zwei und mit drei Komponenten definiert.

Die Klassendefinition wäre nicht erforderlich und setzt zudem PowerShell ab Version 5.0 voraus, aber mit den Klassendefinitionen wird das Beispiel insgesamt etwas besser nachvollziehbar.

Im nächsten Schritt kommen zwei Function-Definitionen zum Einsatz, über die Vektoren definiert werden:

Dass auf den param-Befehl verzichtet wird ist keine Voraussetzung, um die Function wie bei Programmiersprachen üblich aufrufen zu können. Wichtig ist lediglich, dass die Function einen Array-Parameter besitzt, dem alle Argumente übergeben werden.

Der Aufruf der Function v2 sieht wie folgt aus:

und

Mit den zweiten Vektoren wird im nächsten Schritt mit der Function det2 die Determinante der 2×2-Matrize ausgerechnet, die durch die beiden Vektoren gebildet wird. Auch diese Function wird so definiert, dass sie mit runden Klammern aufgerufen werden muss.

<# .Synopsis Determinante eines Vektors mit 2 Komponenten #>

function det2
{
param([Vektor2[]]$v)
return ($v[0].x * $v[1].y – $v[0].y * $v[1].x)
}

Beim Aufruf der Function det ist ein kleiner Umweg erforderlich: Der Rückgabewert muss einer Variablen zugewiesen werden. Ansonsten funktioniert die Multiplikation mit 0.5 oder einer anderen Zahl nicht. Warum das so ist, muss ich noch herausfinden (ich bin sicher, dass Friedrich die Antwort kennt;)

Fazit: Wer Functions bei PowerShell so verwenden möchte wie bei VBScript, JavaScript und den meisten Programmiersprachen kann dies tun. Eine Einschränkung besteht darin, dass wenn die Argumente per Komma getrennt übergeben werden soll, ein Array-Parameter benötigt wird.

Praxistipp: .NET Vesionsnummern auslesen mit einem Tool und einer Prise Regex

Es gibt mehrere Alternativen, um die Versionsnummern aller instlalierten .NET-Versionen zu erhalten. Meine „Lieblingsvariante“ ist immer noch ein kleines Tool mit dem Namen .NET Version Detector von einem belgischen Entwickler mit dem leicht zu merkenden Domännamen asoft.be:

http://www.asoft.be/prod_netver.html

Das kleine Tool zeigt alle vorhandenen Versionen nicht nur in einem Fenster an, sondern schreibt sie wenn das Tool in der Befehlszeile aufgerufen wird auch in eine Textdatei.

Mit einer Prise Regex erhält man die Versionsnummern zurück.

PowerShell-Tipp: switch-Überprüfung mit continue abbrechen

Der switch-Befehl der PowerShell ist leistungsfähig, besitzt aber seine kleinere „Besonderheiten“. Eine davon ist, dass eine Überprüfung von mehreren Werten nicht per break, sondern per continue-Befehl abgebrochen wird. Während break die switch-Abfrage komplett abbricht, bricht continue nur den aktuellen Durchlauf ab. Zwingend erforderlich ist aber keiner der beiden Befehle. Es hängt von der Abfragelogik ab, ob nach der ersten Übereinstimmung nach weiteren Übereinstimmungen gesucht werden soll oder nicht.

Hier ein kleines Beispiel.

Ohne continue würden jeweils drei Meldungen ausgegeben werden. In der Hilfe ist das alles unter about_switch schön beschrieben;)

Umgang mit generischen Listen (Teil 1)

Eine generische Collection ist der Fachbegriff für ein Array bzw. allgemein eine Liste, die nur eine bestimmte „Sorte“ von Werten aufnehmen kann. Zum Beispiel Zahlen (Int32), Zeichenketten (String) oder bestimmte Objekttypen. Der Vorteil ist, dass eine generische Liste immer nur eine Sorte von Werten besitzt. Einen zwigenden Grund gibt es für diesen Speziallfall im PowerShell-Alltag nicht. Dennoch ist es gut, dass man auch in PowerShell generische Listen anlegen kann, da es einige Methoden gibt, die diese Sorte von Parameterwert erwarten. Außerdem wäre es schade, wenn das Umsetzen von C#-Code auf PowerShell-Skript an einem solchen Detail scheitern würde.

Das Anlegen einer generischen Liste ist grundsätzlich einfach.

WTToken ist lediglich irgendein Typ, der z.B. als Klasse definiert wird.

Das Hinzufügen eines Elements geschieht per Add-Methode:

Das war einfach, jetzt wird es etwas anspruchsvoller und leider unnötig kompliziert. Der letzte Befehl fügt ein WTToken-Objekt zu einer Liste hinzu. Über den Konstruktor werden die Properties Typ und Name mit Werten belegt. Für die Property Wert gibt es keinen Konstruktorparameter, da diese Property nicht immer belegt werden soll. Möchte man der Property einen Wert zuweisen, müsste man formal zuerst eine Variable anlegen:

Das ist aber etwas umständlich. In C# gibt es dafür Objektinitialisierer mit einer einfachen Syntax:

Bei der PowerShell 6.0 gibt es diese Möglichkeit noch nicht („noch“ weil es ja nur eine Frage der Zeit ist, bis ein Vorschlag im Projektportal eingereicht bzw. eventuell sogar fertig als Pull Request eingereicht wird).

Eine eventuell naheliegende Schreibweise funktioniert leider nicht.

Der Grund ist, dass die Zuweisung zwar grundsätzlich funktioniert, dabei aber kein WTToken-Objekt resultiert, das der Add-Methode übergeben werden könnte. Auch ein weiteres in runde Klammern setzen bringt nichts, da in diesem Fall lediglich der zugewiesene Wert zurückgegeben wird. In diesem Punkt gibt es also noch Verbesserungsbedarf was das Thema Objektinitialisierer beim Anlegen eines Objekts über die statische New-Methode angeht.

Es gibt einen „Workaround“, doch leider ist dieser arg umständlich und damit keine echte Verbesserung. Dieser besteht darin, einen Scriptblock zu übergeben, in dem das Objekt angelegt wird. Da aber auch hier eine Variable benötigt wird, damit am Ende das Objekt zurückgegeben werden kann, ist das Ganze nicht besonders elegant. Im Folgenden geht es daher nur um das Prinzip bzw. ein Anschauungsbeispiel.

Wer bis hierhin mitgelesen hat (dafür erst einmal einen herzlichen Glückwunsch angesichts der etwas trockenen Thematik, es lief wohl gerade nichts Passendes im Fernsehen, auf Netflix oder irgendwo anders;), natürlich gibt es eine einfache Lösung: Das New-Object-Cmdlet und seinen Propert-Parameter, mit dessen Hilfe sich ein Objekt gleichzeitig anlegen und was einzelne Eigenschaften betrifft initialisieren lässt.

Vielleicht nicht ganz so elegant wie die moderne Schreibweise per New, aber auf alle Fälle nachvollziehbar und trotzdem alles in allem relativ einfach in der Umsetzung.

Tipp: Mehrdimensionale Arrays als Parameter übergeben

Grundsätzlich ist der Umgang mit mehrdimensionalen Arrays bei der PowerShell kein Problem, man muss sich allerdings an die etwas spezielle Schreibweise beim Anlegen eines mehrdimensionalen Arrays gewöhnen. Da hätten sich die Väter der PowerShell etwas überlegen können.

Der folgende Befehl legt ein leeres zweidimensionales Array vom Typ 2×10 an. Die erste Dimension ist damit 2, die zweite Dimension 10.

Wird ein mehrdimensionales Array einer Function als Parameter übergeben, sieht die Datentyp-Deklaration fast genauso aus.

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

Meine ersten Schritte mit Docker und wie man einen Linux-Admin von der PowerShell überzeugen kann (Teil 1)

Docker ist das Hype-Wort der Stunde. Zum allergrößten Teil steckt hinter Docker natürlich eine solide Technik und wenig Hype, aber wer die Ankündigungen der Hersteller, inklusive Microsoft, in den letzten 1-2 Jahren verfolgt hat, wird festgestellt haben, dass das Wort Container bzw. Docker als wichtigste Container-Technik Pflichtbestandteil von strategischen Ankündigungen geworden ist. Die IT-Branche braucht alle paar Jahren ihr „next bing thing“ und das ist auch ja grundsätzlich in Ordnung.

Docker ist eine Container-Technik. Eine Container ist eine virtuelle Umgebung, in der eine Anwendung alle für die Ausführung benötigten „Abhängigkeiten“ in Gestalt der entsprechenden Dateien inklusive Dateisystem und Netzwerkschnittstelle vorfindet. Im Unterschied zur Virtualisierung ist der Aufwand deutlich geringer, da alle Container unter einem bestimmten Betriebssystem ausführen – ein Container kann aber auch sein eigenes Betriebssystem mitbringen. Container bieten daher zahlreicher Vorteile für die Bereitstellung, von der vor allem Webanwendungen und generell Anwendungen ohne eigene Benutzeroberfläche profitieren. Sie benötigen weniger Arbeitsspeicher, weniger Festplattenspeicher, starten schneller als eine VM, sind offenbar deutlich besser skalierbar, können im Verbund (Stichwort: Kubernetes, das nächste Hype-Wort nach Container) eingesetzt, lassen sich schnell erstellen. Sozusagen eine Wegwerfverpackung für eine Anwendung.

Mit der PowerShell gibt es zunächst keine Berührungspunkte. PowerShell-Skripte sind bekanntlich keine Anwendungen, sie werden auf einfachste Weise bereitgestellt und es gibt nur selten Abhängigkeiten, die vor ihrer Ausführung aufgelöst werden müssten – Module und DSC-Ressourcen fallen mir natürlich ein. Die Ausführung eines Skripts in einem Container könnte daher eine Option sein, wenn mehrere Module verwendet oder eine Abhängigkeit zu einer bestimmten Version des .NET Framework oder in Zukunft auch .NET Core besteht. In diesem Fall gibt man einen Container weiter, aus dem das Skript gestartet wird.

Im Folgenden geht es um eine naheliegende Anwendung: Ich möchte die PowerShell unter Ububtu, Cent OS oder Suse ausprobieren, habe aber eine Lust für jedes OS eine VM einzurichten.

Die gute Nachricht ist, Microsoft bietet ein fertiges Image für einen Container an, in dem Ubuntu 16.04 und eine Beta der PowerShell 6.0 enthalten sind.

Wie das Ganze umgesetzt wird, ist auf der Projektseite der PowerShell Core beschrieben:

https://github.com/PowerShell/PowerShell/tree/master/docker

Die Umsetzung ist sehr einfach. Voraussetzung sind allerdings Windows 10 64 Bit bzw. Windows Server 2016, da sich Docker für Windows nur auf diesen Betriebssystemen installieren lässt.

Die Downloadadresse ist von Docker CE (Community Edition) ist:

https://store.docker.com/editions/community/docker-ce-desktop-windows

Eine weitere Einschränkung besteht darin, dass Docker auch unter Windows einen Linux-Kernel erfordert. Dieser wird bei Docker for Windows über eine Hyper V-VM zur Verfügung gestellt. Es muss daher möglich sein, Hyper V zu aktivieren. Wer bereits VMware Workstation verwendet, müsste VMware Workstation vorübergehend deinstallieren, damit Hyper V aktiviert werden kann.

Wurde Docker for Windows installiert, dauert es einen kurzen Augenblick ist der Dienst zur Verfügung steht. Anschließend steht das Docker-Befehlszeilentool zur Verfügung.

Der folgende Befehl lädt ein Docker-Image mit installierter PowerShell:

Tipp: Sollte es zwischendurch zu „Verbindungsproblemen“ kommen, die dazu führen, dass das Image nicht oder nur unvollständig geladen wird, die folgende kleine Änderung hat bei mir immer geholfen: Trage für den DNS-Server in der Netzwerkverbindung die Adresse 8.8.8.8 ein, der Google-DNS-Server bietet eine sehr schnelle Namensauflösung.

Etwas später startet die PowerShell Core unter Ubuntu in einem Container. Wie lässt sich das feststellen? Gar nicht, denn es ist ja gerade der Sinn und Zweck eines Containers, dass die Anwendung in ihrer vertrauten Umgebung ausführt.

PowerShell Core läuft unter Windows in einem Container mit Linux Ubuntu als OS

PowerShell Core läuft unter Windows in einem Container mit Linux Ubuntu als OS

Jetzt würde es mich doch interessieren, unter welcher Linux-Version die PowerShell ausführt. Als absoluter Linux-Noob fällt mir spontan keine Lösung ein. Unter Linux gibt es kein WMI, sonst wäre es sehr einfach, den Titel und die Version des OS per Win32_OperatingSystem abzufragen. Aber wozu gibt es das Internet? Eine kurze Recherche ergibt, dass man sich nur den Inhalt einer Datei ausgeben lassen muss:

Die Ausgabe besteht aus einer Reihe Zeilen, die alle gleich aufgebaut sind: Name = Wert. Für einen Linux-Admin ist das Zerlegen von Text mit Tools wie Awk und Sed sein tägliches Brot. Doch wenn selbst eine einfache Lösung aus zwei bis drei Zeilen Text besteht, der jede Menge „Spezialzeichen“ enthält, stellt sich die Frage, ob es nicht eine einfachere Lösung gibt. Die gibt es natürlich und besteht darin, den split-Operator im Rahmen einer ForEach-Wiederholung für jede Zeile auszuführen und das Ergebnis der besseren Weiterverarbeitbarkeit zu Liebe als Objekte auszugeben.

Der folgende PowerShell-Befehl macht genau das:

Oder

Ich bin mir sicher, dass Beispiele wie dieses auch bei Linux-Admins schnell ein gewisses Interesse an der PowerShell wecken dürften. Ob sie dabei in einem Container läuft oder nicht spielt dafür natürlich keine Rolle.

Der Inhalt einer Textdatei unter Linux per PowerShell in Objekte zerlegt

Der Inhalt einer Textdatei unter Linux per PowerShell in Objekte zerlegt