Tipp des Tages: Einzelaktionen ausführen mit Invoke-Command statt ForEach-Object

Eine der größten Hürden, die PowerShell-Einsteiger (bildlich gesprochen) überwinden müssen ist zu verstehen, wie auf eine Get-Abfrage eine individuell festgelegte Aktion folgen kann.

Beispiel: Wenn ein bestimmter Dienst nicht ausführt, soll eine Mail verschickt und ein Eintrag in einer Log-Datei geschrieben werden. Das Beispiel wirkt vielleicht ein wenig konstruiert. Es geht im Grunde darum, dass auf eine Get-Abfrage eine Aktion folgen soll, die sich nicht nur ein einzelnes Cmdlet abbilden lässt.

Die Lösung besteht normalerweise im Aufruf des ForEach-Object-Cmdlets, in dessen Process-Scriptblock alle Aktionen aneinandergereiht werden:

Get-Service -Name WinRM| Where-Object Status -ne "Running" | ForEach-Object {
"Aktion1"
"Aktion2"
}

Was mir an der Umsetzung nicht ganz so gut gefällt ist der Umstand, dass ForEach-Object auch dann verwendet wird, wenn nur eine Aktion ausgeführt werden soll.

Eine Alternative ist das Invoke-Command-Cmdlet. Auch wenn es in erster Linie für PowerShell-Remoting verwendet wird, kann es natürlich auch für lokale Ausführungen verwendet werden. Im einfachsten Fall wie folgt.

Get-Service -Name WinRM | Where-Object Status -ne "Running" | Invoke-Command {
"Aktion1"
"Aktion2"
}

Ganz optimal ist diese Variante sicher auch nicht. Vielleicht sollte es einfach nur mit „Invoke-Scriptblock“ einen weiteren Alias für ForEach-Object geben:

Set-Alias -Name Invoke-Scriptblock -Value ForEach-Object

Get-Service -Name WinRM | Where-Object Status -ne "Running" | Invoke-Scriptblock {
"Aktion1"
"Aktion2"
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.