THEMA about_Foreach KURZBESCHREIBUNG Beschreibt einen Sprachbefehl, mit dem Sie alle Elemente in einer Auflistung von Elementen durchlaufen können. DETAILBESCHREIBUNG Die Foreach-Anweisung (Foreach-Schleife) stellt ein Sprachkonstrukt für das Durchlaufen (Iterieren) einer Reihe von Werten in einer Auflistung dar. Arrays stellen den einfachsten und häufigsten Auflistungstyp dar, der durchlaufen wird. In einer Foreach-Schleife werden häufig ein oder mehrere Befehle für jedes Element in einem Array ausgeführt. Syntax Die Syntax der Foreach-Anweisung lautet: foreach ($<Element> in $<Auflistung>){<Anweisungsliste>} Foreach-Anweisung außerhalb einer Befehlspipeline. Der in Klammern eingeschlossene Teil der Foreach-Anweisung stellt eine Variable und eine zu durchlaufende Auflistung dar. Bei Ausführung der Foreach-Schleife wird die Variable ($<Element>) automatisch von Windows PowerShell erstellt. Vor jedem Durchlaufen der Schleife wird die Variable auf einen Wert in der Auflistung festgelegt. Der auf eine Foreach-Anweisung folgende Block {<Anweisungsliste>} enthält eine Reihe von Befehlen, die für jedes Element in einer Auflistung ausgeführt werden. Beispiele Im folgenden Beispiel werden mit der Foreach-Schleife die Werte im Array "$letterArray" angezeigt: $letterArray = "a","b","c","d" foreach ($letter in $letterArray) { Write-Host $letter } In diesem Beispiel wird das Array "$letterArray" mit den Zeichenfolgenwerten "a", "b", "c" und "d" erstellt und initialisiert. Bei der ersten Ausführung der Foreach-Anweisung wird die Variable "$letter" auf den Wert des ersten Elements in $letterArray ("a") festgelegt. Dann wird mit dem Cmdlet "Write-Host" der Buchstabe "a" angezeigt. Beim nächsten Durchlaufen der Schleife wird $letter auf "b" festgelegt usw. Nachdem der Buchstabe "d" von der Foreach-Schleife angezeigt wurde, wird diese beendet. Wenn Sie die Foreach-Anweisung als Befehl an der Windows PowerShell-Eingabeaufforderung ausführen möchten, muss die gesamte Anweisung auf einer Zeile stehen. Die gesamte Foreach-Anweisung muss nicht auf einer einzelnen Zeile stehen, wenn Sie stattdessen den Befehl in einer PS1-Skriptdatei einfügen. Foreach-Anweisungen können auch zusammen mit Cmdlets verwendet werden, die eine Auflistung von Elementen zurückgeben. Im folgenden Beispiel durchläuft die Foreach-Anweisung die Liste der vom Cmdlet "Get-ChildItem" zurückgegebenen Elemente: foreach ($file in Get-ChildItem) { Write-Host $file } Sie können das Beispiel optimieren, indem Sie die zurückgegebenen Ergebnisse mit einer If-Anweisung einschränken. Im folgenden Beispiel wird von der Foreach-Anweisung die gleiche Schleife wie im vorherigen Beispiel ausgeführt. Zur Einschränkung des Ergebnisses auf größere Dateien als 100 KB wird jedoch eine If-Anweisung hinzugefügt: foreach ($file in Get-ChildItem) { if ($file.length -gt 100k) { Write-Host $file } } In diesem Beispiel führt die Foreach-Schleife einen Vergleich ($file.length -gt 100k) mit einer Eigenschaft der Variablen "$file" durch. Die Variable "$file" enthält alle Eigenschaften in dem vom Cmdlet "Get-ChildItem" zurückgegebenen Objekt. Daher kann mehr als nur der Dateiname zurückgegeben werden. Im nächsten Beispiel gibt Windows PowerShell die Länge und den Zeitpunkt des letzten Zugriffs in der Anweisungsliste zurück: foreach ($file in Get-ChildItem) { if ($file.length -gt 100k) { Write-Host $file Write-Host $file.length Write-Host $file.lastaccesstime } } In diesem Beispiel sind Sie nicht darauf beschränkt, in einer Anweisungsliste einen einzelnen Befehl auszuführen. Sie können auch eine Variable außerhalb einer Foreach-Schleife verwenden und die Variable in der Schleife erhöhen. Im folgenden Beispiel werden Dateien über 100 KB gezählt: $i = 0 foreach ($file in Get-ChildItem) { if ($file.length -gt 100k) { Write-Host $file "Dateigröße:" ($file.length / 1024).ToString("F0") KB $i = $i + 1 } } if ($i -ne 0) { Write-Host Write-Host $i "Datei(en) größer als 100 KB im aktuellen Verzeichnis."} else { Write-Host "Keine Dateien größer als 100 KB im aktuellen Verzeichnis." } Im vorherigen Beispiel wurde die Variable "$i" außerhalb der Schleife auf den Wert "0" festgelegt, und die Variable wurde in der Schleife für jede gefundene Datei erhöht, die größer als 100 KB ist. Beim Beenden der Schleife wird mit einer If-Anweisung den Wert von $i ausgewertet, um die Gesamtanzahl der Dateien über 100 KB anzuzeigen. Es kann auch die Meldung angezeigt werden, dass keine Dateien über 100 KB gefunden wurden. Im vorangegangenen Beispiel wird auch das Formatieren der Ergebnisse für die Dateilänge gezeigt: ($file.length / 1024).ToString("F0") Um die Ergebnisse in Kilobytes anstelle von Bytes anzuzeigen, wird der Wert durch 1.024 dividiert, und das Ergebnis wird mit dem Festkomma-Formatbezeichner formatiert, um mögliche Dezimalwerte zu entfernen. Wegen der Ziffer 0 zeigt der Formatbezeichner keine Dezimalstellen an. Foreach-Anweisung innerhalb einer Befehlspipeline. Wenn Foreach in einer Befehlspipeline enthalten ist, verwendet Windows PowerShell den foreach-Alias, mit dem der Befehl ForEach-Object aufgerufen wird. Wenn Sie den foreach-Alias in einer Befehlspipeline verwenden, müssen Sie die Syntax ($<Element> in $<Auflistung>) im Gegensatz zu einer Foreach-Anweisung nicht verwenden. Dies liegt daran, dass die Informationen vom vorherigen Befehl in der Pipeline bereitgestellt werden. Die Syntax des foreach-Alias in der Befehlspipeline lautet wie folgt: <Befehl> | foreach {<Befehlsblock>} Beispielsweise werden von der Foreach-Schleife in der folgenden Befehlspipeline alle Prozesse angezeigt, deren Workingset (Speicherauslastung) größer als 20 MB ist. Die Ausgabe des Befehls "Get-Process" wird von Windows PowerShell über die Pipeline an den foreach-Alias übergeben. Im Befehlsblock des foreach-Alias enthält die Variable "$_.WS" den Wert der WS-Eigenschaft (Workingset), die an diese vom Cmdlet "Get-Process" übergeben wurde. (Der $_-Teil der Deklaration ist eine automatische WSH-Variable [Windows Script Host], und der WS-Teil bildet eine Eigenschaft). Die If-Anweisung bestimmt mit einer bedingten Anweisung, ob die Größe des Workingsets 20 MB (2.0000.000 Bytes) übersteigt. Wenn dies der Fall ist, werden der Name des Prozesses in der Variablen "$_.name" und die Größe des Workingsets in Megabytes angezeigt. Andernfalls wird nichts angezeigt. Write-Host "Prozesse mit Workingsets größer als 20 MB" Get-Process | foreach { if ($_.WS -gt 20m) { Write-Host $_.name ": " ($_.WS/1m).ToString("F0") MB -Separator "" } } Der foreach-Alias unterstützt auch einleitende, mittlere und abschließende Befehlsblöcke. Während der einleitende und der abschließende Befehlsblock einmal ausgeführt werden, wird der mittlere Befehlsblock bei jedem Durchlauf der Foreach-Schleife über eine Auflistung oder ein Array ausgeführt. Die Syntax eines foreach-Alias in einer Befehlspipeline für eine einleitende, eine mittlere und eine abschließende Reihe von Befehlsblöcken lautet wie folgt: <Befehl> | foreach {<einleitender Befehlsblock>}{<mittlerer Befehlsblock>}{<abschließender Befehlsblock>} Im folgenden Beispiel wird die Verwendung des einleitenden, des mittleren und des abschließenden Befehlsblocks gezeigt. Get-ChildItem | foreach { $fileCount = $directoryCount = 0}{ if ($_.PsIsContainer) {$directoryCount++} else {$fileCount++}}{ "$directoryCount Verzeichnisse $fileCount Dateien"} Mit dem einleitenden Block werden zwei Variablen erstellt und mit 0 initialisiert. {$fileCount = $directoryCount = 0} Der mittlere Block wertet aus, ob es sich bei den einzelnen, von Get-ChildItem zurückgegebenen Elementen um Verzeichnisse oder Dateien handelt: {if ($_.PsIsContainer) {$directoryCount++} else {$fileCount++}} Wenn es sich beim zurückgegebenen Element um ein Verzeichnis handelt, wird die Variable "$directoryCount" um 1 erhöht. Andernfalls wird die Variable "$fileCount" um 1 erhöht. Der abschließende Block wird ausgeführt, nachdem der mittlere Block die Schleife abgeschlossen hat, und gibt dann die Ergebnisse des Vorgangs zurück: {"$directoryCount Verzeichnisse und $fileCount Dateien"} Mit dieser Struktur aus einleitendem, mittlerem und abschließendem Befehlsblock sowie Pipelineoperator können Sie das frühere Beispiel wie folgt umschreiben, um Dateien mit einer Größe von über 100 KB zu suchen. Get-ChildItem | foreach{ $i = 0}{ if ($_.length -gt 100k) { Write-Host $_.name "Dateigröße:" ($_.length / 1024).ToString("F0") KB $i++ } }{ if ($i -ne 0) { Write-Host Write-Host "$i Datei(en) größer als 100 KB im aktuellen Verzeichnis." } else { Write-Host "Keine Dateien größer als 100 KB im aktuellen Verzeichnis."} } SIEHE AUCH about_Automatic_Variables about_If Foreach-Object