PowerShell: Der Output Field Separator

Mit dem Output Field Separator ($OFS) lässt sich das Zeichen festlegen, mit dem einzelne Elemente eines Arrays getrennt werden, wenn ein Array in einen String konvertiert wird. Per Vorgabe verwendet die PowerShell ein Leerzeichen (Space). Wie nachfolgend gezeigt, wird durch die Angabe von $OFS=‘,‘ festgelegt, dass ein Komma als Trennzeichen verwendet werden soll.

PowerShell Version

Die Berücksichtigung der verschiedenen PowerShell Versionen spielt aufgrund der wachsenden Anzahl an Features in jeder neuen PowerShell Version eine wichtige Rolle – insbesondere wenn man Skripte auf unterschiedlichen Versionen einsetzen will oder muss.

Die paar nachfolgenden Skriptzeilen haben mir bisher recht gut geholfen.

PSVCheck liefert True zurück, sofern die aktuell installierte Version größer oder gleich der geforderten Version ist. PSVCheck(3) liefert beispielsweise False zurück, wenn lediglich die PowerShell Version 2 auf einer Maschine installiert ist.

Get-PSVersion neben den beiden Aliasen liefert die PowerShell Version als Zeichenkette.

Get-/Set-DisplayResolution (PowerShell 4)

Die PowerShell 4 besitzt zwei neue Cmdlets zum Ermitteln und Ändern der Bildschirmauflösung. Die beiden Cmdlets wurden in erster Linie zur Nutzung auf einem Server Core Server entwickelt, lassen sich aber auch auf einem Server mit GUI (Graphical User Interface) nutzen.

Mit Get-DisplayResolution, lässt sich die aktuelle Bildschirmauflösung ermitteln.

Umgekehrt lässt sich mit Set-DisplayResolution eine neue Bildschirmauflösung einstellen. Dabei genügt es über die Parameter –Width und –Height die gewünschte Bildschirmauflösung anzugeben.

Ohne die Angabe von –Force erfolgt in einer Box ein Hinweistext, der darauf wartet dass die Übernahme der Auflösung bestätigt werden soll. Erfolgt keine Bestätigung, so wird nach ca. 20 Sekunden automatisch die ursprüngliche Auflösung gesetzt. Mit der Angabe von -Force erfolgt keine Nachfrage mehr, sondern die Umschaltung erfolgt sofort.

Nun war meine Idee, dass die Bildschirmauflösung während der Ausführung eines bestimmten Skripts geändert werden soll und dieses abschließend wieder die ursprüngliche Auflösung zurücksetzt. Allerdings hat mein erster Ansatz – nämlich die Nutzung des Ergebnis von Get-DisplayResolution zum Setzen mit Set-DisplayResolution – nicht funktioniert, denn Get-DisplayResolution liefert ein Array zurück. Damit ich meine Idee letztendlich umsetzen konnte, genügten aber bereits ein paar Zeilen Skriptcode. Zeile 14 dient hier lediglich zur Demonstration, damit zwischen den zwei Umschaltvorgängen auch was passiert 🙂

 

Compare-Object [PowerShell]

Das Cmdlet Compare-Objekt ermöglicht den Vergleich von zwei Objektsätzen. In Abbildung 18, Objektvergleich mit Compare-Object, werden als erstes mit Get-Process die aktuell laufenden Prozesse in der Variablen before gespeichert. Anschließend werden die zwei neuen Prozesse notepad und calc gestartet. Danach werden wieder alle aktuell laufenden Prozesse ermittelt und diesmal in der Variablen after abgelegt. Die Variable before enthält nun den Referenzsatz und after den Differenzsatz. Jetzt kann ein Vergleich dieser beiden Objektsätze mit Compare-Object durchgeführt werden. Im Ergebnis ist zu sehen, dass die beiden Prozesse calc und notepad neu hinzugekommen sind.

Abbildung 18, Objektvergleich mit Compare-Object

Dann wird mit der Kill()-Methode der Prozess notepad beendet und bei einem erneuten Vergleich ist zu sehen, dass der Prozess notepad beendet wurde. Der SideIndicator zeigt jeweils an, ob ein Objekt nur im Differenzsatz (=>) oder nur im Referenzsatz (<=) existiert. Mit dem Schalterparameter IncludeEqual lassen sich auch gleiche Objekte anzeigen, wobei bei Gleichheit der SideIndicator == lautet. Ebenso erlaubt der Schalter ExcludeDifferent die Herausnahme der Differenzanzeige. Soll bei Vergleichen die Groß- und Kleinschreibung berücksichtigt werden, lässt sich dies mit dem Parameter CaseSensitive beeinflussen.

$PWD – PowerShell WorkDirectory

Die PowerShell speichert in $PWD das aktuelle Arbeitsverzeichnis der aktuellen Sitzung. PWD steht hier für PowerShell Work Directory. Bei $PWD handelt es sich aber keineswegs um einen einfachen String – vielmehr ist in der Variablen ein Objekt vom Typ PathInfo gespeichert.

Möchte man nur den Pfad als Zeichenkette haben, lässt sich das Property Path des Objekts verwenden. Alternativ wäre auch der Aufruf von $PWD.ToString() möglich. Beides liefert einen String mit dem aktuellen PowerShell-Verzeichnis. Weiterhin existiert in der Klasse System.Environment des .NET-Frameworks die statische Eigenschaft CurrentDirectory. Auch dort wird das aktuelle Verzeichnis gespeichert – aber eben das aktuelle Verzeichnis für das .NET-Framework. Wird nun innerhalb der PowerShell in ein anderes Verzeichnis gewechselt, bekommt das .NET-Framework davon nichts mit und damit sind die beiden Pfade nicht immer unbedingt identisch. $PWD enthält das tatsächliche Verzeichnis innerhalb der PowerShell, während CurrentDirectory weiterhin sein Verzeichnis beibehält.

Problematisch wird dieser Umstand, sofern innerhalb der PowerShell Funktionen des .NET-Frameworks zum Einsatz kommen, die eben die statische Eigenschaft CurrentDirectory und nicht $PWD berücksichtigen. So kann es dann auch vorkommen, dass bei Verwendung von relativen Pfadangaben beim Speichern von Dateien, diese in einem anderen Verzeichnis abgelegt werden als man eigentlich erwartet hätte. Im nachfolgenden Beispiel erwartet man die gespeicherte Datei sicherlich im Verzeichnis C:\Users – da CurrentDirectory jedoch C:\Users\Hajo enthält, wird die Datei auch in diesem Verzeichnis abgelegt.

Zur Lösung dieses Problems verwendet man anstelle der relativen Pfadangabe die Variable $PWD. Alternativ wäre es auch möglich der statischen Eigenschaft CurrentDirectory das entsprechende Verzeichnis zuzuweisen. Eine solche Zuweisung wirkt sich lediglich auf die aktuelle Sitzung aus. Wie man letztendlich vorgeht ist situationsbedingt und nicht zuletzt Geschmackssache. Ich persönlich favorisiere die Verwendung von $PWD in den Pfadangaben.

Das nachfolgende Beispiel demonstriert die Vorgehensweise unter Verwendung von $PWD anstelle der normalen relativen Pfadangabe. Damit ist sichergestellt, dass die Datei auch wirklich an der gewünschten Stelle abgespeichert wird.