Archiv der Kategorie: PowerShell lernen

Kleine Beispiele, die sich für Schulungen eignen

Seltsame PowerShell-Phänome (Teil 45)

Manchmal kann das Arbeiten mit der PowerShell nervig oder faszinierend sein. Je nachdem, ob eine Anforderung unbedingt umsetzen möchte, oder man viel Zeit hat sich mit besonderen „Phänomen“ zu beschäftigen. Das folgende, eigentlich ganz simple Phänom befindet sich bei mir im Moment noch in der Kategorie ungelöst.

Ausgangspunkt ist das Abfragen der Inhalte einer PowerPoint-Datei über die DocumentFormat.OpenXml-Assembly aus dem Open XML SDK.

Die Anforderung ist die Ausgabe aller Slides bzw. deren Ids. Auch wenn die folgende Vorgehensweise nicht die Richtige ist, sollte doch ein konsistentes Verhalten resultieren.

Der folgende Befehl sollte alle „Abkömmlinge“ vom Typ „SlideId“ holen

@($presentationPart.Presentation.Descendants()).Where{$_.GetType().Name -eq "SlideId"}

Die Abfrage gibt aber nichts zurück. Es funktioniert, wenn anstelle des -eq-Operators der -match- oder -like-Operator verwendet wird:

@($presentationPart.Presentation.Descendants()).Where{$_.GetType().Name-match "SlideId"}

Die Rückgabe besteht aus einem Objekt vom Typ SlideIdList und mehreren Objekten vom Typ SlideId. Irgendetwas scheint an dem Vergleich nicht zu stimmen.

Eigentlich sollte Where{} nur die Objekte liefern, die vom Typ „SlideId“ sind. Da es aber auch ein Objekt gibt, das vom Typ „SlideIdList“ ist, funktioniert der Vergleich mit dem eq-Operator nicht und es werden beim Vergleich mit „SlideId“ keine Objekte zurückgegeben.

Kurios ist, dass der folgende Vergleich funktioniert:

@($presentationPart.Presentation.Descendants()).Where{$_.GetType().Name-match "SlideId"}.ForEach{$_.GetType().Name -eq "SlideId"}

Diese Abfrage gibt für jeden Typnamen = „SlideId“ mit dem eq-Operator ein $true zurück. Es muss also „irgendwie“ mit dem Umstand zu tun haben, dass das erste Objekt vom Typ SlideIdList ist, die übrigen vom Typ SlideId und mit dem, was durch die Array-Konvertierung der Rückgabe von Descendants() (eine generische Collection) entstanden ist.

Da ich keine Lust habe, einen schönen Sonntagnachmittag mit der Lösung zu verbringen, gebe ich an dieser Stelle auf und bin gespannt, wann ich eine Erklärung für dieses (im Grunde natürlich vollkommen unwichtige) Phänom erhalte. Apropos unwichtige Kleinigkeit: Hätte sich Clifford Stoll irgendwann Ende der 80er Jahre nicht über eine Abrechnungsdifferenz von wenigen Cents gewundert, wäre er nicht einem der größten Hacker-Einbrüche in den USA auf die Spur gekommen.

PowerShell lernen – Alle Exe-Dateien finden

Wer die PowerShell muss sich u.a. daran gewöhnen, dass als Parameterwert immer auch das Ergebnis eines anderes Befehls eingesetzt werden kann.

Aufgabenstellung: Ausgabe aller Exe-Dateien, die mit dem Namen „Fus“ beginnen, und deren Pfade auf der Grundlage der Verzeichnisse in der Path-Umgebungsvariablen.

Schritt 1: So geht es nicht

Der folgende Aufruf wäre denkbar, doch so einfach geht es nicht.

dir $env:path -filter fus*.exe

Schritt 2: So geht es

Da die Path-Umgebungsvariable in der Regel mehrere Verzeichnispfade enthält, die per Semikolon getrennt sind, muss dies beim Aufruf berücksichtigt werden.

dir ($env:path -split ";") -filter fus*.exe

Schritt 3: Alles zusammen ausgeben

Jetzt werden alle Dateien aufgelistet, aber pro Verzeichnis. Möchte man alle Dateien in einer Liste erhalten, muss z.B. ein Select-Object angehängt werden. Dabei wird auch festgelegt, dass pro Datei der vollständige Pfad ausgegeben werden soll.

dir ($env:path -split ";") -filter fus*.exe | Select-Object FullName