Verwenden des Cmdlet \"ForEach-Object\"

Durchlaufen einer Objektmenge

Mit dem Cmdlet ForEach-Object können alle Elemente einer Menge durchlaufen und dabei eine Operation auf den Elementen ausgeführt werden. Beachten Sie, dass Sie in vielen Situationen ForEach-Object nicht benötigen, da die meisten Cmdlets standardmäßig alle Elemente einer Menge bearbeiten. Wenn Sie beispielsweise das Cmdlet Get-Process aufrufen, erhalten Sie automatisch Informationen über alle auf Ihrem Computer ausgeführten Prozesse zurück, und Sie brauchen ForEach-Object nicht, um die Menge zu durchlaufen. (Das ist anders als in VBScript, wo Sie normalerweise eine "For Each"-Schleife einrichten müssen, wenn Sie alle Elemente einer Menge berücksichtigen wollen.)

Andererseits kann es Situationen geben, in denen Sie eine zusätzliche Formatierung benötigen oder andere Änderungen an den Objekten einer Menge vornehmen wollen. In diesen Fällen müssen Sie häufig ForEach-Object verwenden. Angenommen, Sie wollen eine Liste mit Prozessnamen anzeigen, aber Sie wollen auch, dass diese Namen in der Farbe Cyan angezeigt werden. (Keine Sorge: Die Skripting-Leute werden sich nie ein Urteil über die Dinge erlauben, die Sie machen, und auch nicht darüber, warum Sie sie machen.) Dieser Befehl schlägt fehl, weil das Cmdlet Write-Host nicht weiß, was mit den über die Pipeline gesendeten Daten passieren soll:

Get-Process | Write-Host $_.name -foregroundcolor cyan

Genauer gesagt, Sie erhalten die folgende Fehlermeldung:

At line:1 char:25
+ get-process | write-host  <<<< $_.name -foregroundcolor cyan Write-Host : The input object
cannot be bound to any parameters for the command  either because the command does not
take pipeline input or the input and its properties do not match any of the parameters
that take pipeline input.

Was also machen Sie in einer solchen Situation? Natürlich verwenden Sie ForEach-Object:

Get-Process | ForEach-Object {Write-Host $_.name -foregroundcolor cyan}

Jetzt ermitteln wir die Prozessinformationen und reichen diese statt an Write-Host an ForEach-Object weiter. Das tun wir deshalb, weil ForEach-Object genau weiß, was mit einer Objektmenge zu geschehen hat, die ihm über die Pipeline übergeben wird: Es durchläuft die Menge und führt für jedes einzelne dieser Objekte eine Operation aus. Und was genau macht es mit diesen Objekten? Ganz einfach: ForEach-Object führt die innerhalb der geschweiften Klammern angegebenen Befehle aus. In diesem Fall wenden wir für jedes Element der Menge das Cmdlet Write-Host an, um den Wert der Eigenschaft "Name" auf den Bildschirm zu schreiben - in cyanfarbenen Buchstaben.

Und so sieht das Konsolenfenster nach Ausführung des Befehls aus:

Windows PowerShell

Aliase für "ForEach-Object"

  • foreach