Variablen interaktiv

… also interaktiv in der PowerShell Konsole.

Einsatz von Variablen: Übersichtlichkeit schaffen - Vorarbeiten für Skripting

Get-Process | Where-Object {$_.name -eq "iexplore"} | Foreach-Object { $_.ws }

wird zu

$x = Get-Process
$y = $x | Where-Object {$_.name -eq "iexplore"}
$z = $y | Foreach-Object { $_.ws }

Ausgabe dann mit $z!

Anm. zu Prozessen ab Windows 10: bitte beachten, dass man zwei Microsoft Browser hat (Internet Explorer und Edge).

Verzweigungen („Tee“)

Verzweigungen mittels Tee-Object zu Variablen oder Dateien: Es wird eine Variable $a erstellt (Achtung: hier beim Teeing ohne $) und eine Datei dienste.txt erstellt.

Get-Service | Tee-Object -var a | Where-Object { $_.Status -eq "Running" } | select name | Tee-Object -filepath E:\_temp\dienste.txt | Format-Table name

alternative Lösung:

Get-Service -OutVariable a | Where-Object { $_.Status -eq "Running" } | select name |
    Set-Content E:\_temp\dienste.txt -PassThru | Format-Table name

Parameter -PipelineVariable

Der mit PowerShell-Version 4.0 eingeführte allgemeine Parameter –PipelineVariable (z.B. Quelle: Schwichtenberg S. 92ff) (kurz: -pv) sorgt dafür, dass das jeweils aktuelle Objekt nicht nur in der Pipeline weitergereicht wird, sondern zusätzlich auch in einer Variablen abgelegt wird.

Das folgende Beispiel setzt dies ein, um am Ende eine Liste von Ausgaben aus zwei verschiedenen Objekten zu liefern: den Namen und das Workingset eines Prozesses von Get-Process und den Namen und den zugehörigen Security Identifier des Benutzers, unter dem der Prozess läuft. Die Pipeline beginnt mit dem Holen der laufenden Prozesse unter Einbeziehung der Benutzeridentität, die in der Form „DomäneBenutzername“ geliefert wird. Dabei wird das aktuelle Process-Objekt mit –pv auch in der Variablen $p abgelegt. Im zweiten Schritt wird für den Benutzernamen das zugehörige WMI-Objekt Win32_User geholt. Im dritten Pipeline-Schritt werden dann zuerst die zwei Informationen aus dem Process- Objekt ausgegeben (das sich in $p befindet) sowie die Informationen aus dem Win32_User-Objekt, die sich nun in der Pipeline befinden ($_).

Get-Process -IncludeUserName -pv p |
    % { Get-WmiObject win32_useraccount –filter "name='$(($_.username -split "\\")[1])'" } |
    % { $p.name + ":" + $p.ws + ":" + $_.Name + ";" + $_.SID }

ACHTUNG: Der Parameter –PipelineVariable funktioniert nicht wie gewünscht, wenn Cmdlets in der Pipeline sind, die die Ergebnisse puffern (z. B. Sort-Object, Group-Object), da der Parameter –PipelineVariable sich ja immer nur auf das aktuelle Objekt bezieht, was in diesen Fällen also immer das letzte Objekt ist.

Objekte vergleichen

Szenario: Vergleich mit Process-Objekten „vorher“ vs. „nachher“

$Pre = Get-Process

Jetzt/Hier Programme/Prozesse starten/beenden

$Post = Get-Process
Compare-Object $Pre $Post

Beispielhaftes Ergebnis:

PS E:\_temp> $pre = Get-Process
PS E:\_temp> $post = Get-Process
PS E:\_temp> Compare-Object $pre $post

InputObject                                 SideIndicator
-----------                                 -------------
System.Diagnostics.Process (powershell_ise) =>
System.Diagnostics.Process (taskeng)        =>
System.Diagnostics.Process (notepad++)      <=

Die Objekte sollten von gleichem Typ sein!