Führt einen Vorgang für die einzelnen Eingabeobjekte einer Gruppe von Eingabeobjekten aus.
Syntax
ForEach-Object [-Process] <ScriptBlock[]> [-Begin <scriptblock>] [-End <scriptblock>] [-InputObject <psobject>] [<CommonParameters>]
Beschreibung
Das Cmdlet "ForEach-Object" führt einen Vorgang für die einzelnen Eingabeobjekte einer Gruppe von Eingabeobjekten aus. Die Eingabeobjekte können über die Pipeline an das Cmdlet übergeben oder mit dem InputObject-Parameter angegeben werden.
Der auszuführende Vorgang wird in einem Skriptblock beschrieben, der für das Cmdlet als Wert des Process-Parameters bereitgestellt wird. Der Skriptblock kann ein beliebiges Windows PowerShell-Skript enthalten.
Innerhalb des Skriptblocks wird das aktuelle Eingabeobjekt durch die Variable "$_" dargestellt.
Zusätzlich zu dem Skriptblock, der die für die einzelnen Eingabeobjekte auszuführenden Vorgänge beschreibt, können Sie zwei weitere Skriptblöcke angeben. Ein Skriptblock, der als Wert des Begin-Parameters angegeben wird, wird vor der Verarbeitung des ersten Eingabeobjekts ausgeführt. Der andere wird als Wert des End-Parameters angegeben und nach der Verarbeitung des letzten Eingabeobjekts ausgeführt.
Die Ergebnisse der Auswertung sämtlicher Skriptblöcke, einschließlich der mit "Begin" und "End" angegebenen, werden über die Pipeline übergeben.
Parameter
-Begin <scriptblock>
Gibt einen Skriptblock an, der vor dem Verarbeiten von Eingabeobjekten ausgeführt werden soll.
Erforderlich? |
false |
Position? |
named |
Standardwert |
|
Pipelineeingaben akzeptieren? |
false |
Platzhalterzeichen akzeptieren? |
false |
-End <scriptblock>
Gibt einen Skriptblock an, der nach dem Verarbeiten aller Eingabeobjekte ausgeführt werden soll.
Erforderlich? |
false |
Position? |
named |
Standardwert |
|
Pipelineeingaben akzeptieren? |
false |
Platzhalterzeichen akzeptieren? |
false |
-InputObject <psobject>
Akzeptiert ein Objekt, für das der im Process-Parameter angegebene Skriptblock einen Vorgang ausführt. Geben Sie eine Variable ein, die die Objekte enthält, oder geben Sie einen Befehl oder einen Ausdruck ein, mit dem die Objekte abgerufen werden.
Erforderlich? |
false |
Position? |
named |
Standardwert |
|
Pipelineeingaben akzeptieren? |
true (ByValue) |
Platzhalterzeichen akzeptieren? |
false |
-Process <ScriptBlock[]>
Gibt den Skriptblock an, der auf die einzelnen eingehenden Objekte angewendet wird.
Erforderlich? |
true |
Position? |
1 |
Standardwert |
|
Pipelineeingaben akzeptieren? |
false |
Platzhalterzeichen akzeptieren? |
false |
<CommonParameters>
Dieses Cmdlet unterstützt die folgenden allgemeinen Parameter: -Verbose, -Debug, -ErrorAction, -ErrorVariable, -OutBuffer und -OutVariable. Weitere Informationen finden Sie unter about_Commonparameters.
Eingaben und Ausgaben
Der Eingabetyp ist der Typ der Objekte, die über die Pipeline an das Cmdlet übergeben werden können. Der Rückgabetyp ist der Typ der Objekte, die das Cmdlet zurückgibt.
Eingaben |
System.Management.Automation.PSObject Sie können jedes Objekt über die Pipeline an ForEach-Object übergeben. |
Ausgaben |
System.Management.Automation.PSObject Welche Objekte ForEach-Object zurückgibt, hängt von der Eingabe ab. |
Beispiel 1
C:\PS>30000,56798,12432 | foreach-object -process {$_/1024} Beschreibung ----------- Dieser Befehl akzeptiert ein Array von ganzen Zahlen, teilt jede davon durch 1024 und zeigt die Ergebnisse an.
Beispiel 2
C:\PS>get-childitem C:\ | foreach-object -process { $_.length / 1024 } Beschreibung ----------- Mit diesem Befehl werden die Dateien und Verzeichnisse im Stamm des Laufwerks "C:" abgerufen, und deren jeweilige Größe wird abgerufen und angezeigt. Die Nullen stellen Verzeichnisse dar, deren Dateigröße nicht verfügbar ist.
Beispiel 3
C:\PS>$events = get-eventlog -logname system -newest 1000 C:\PS> $events | foreach-object -begin {get-date} -process {out-file -filepath events.txt -append -inputobject $_.message} -end {get-date} Beschreibung ----------- Mit diesem Befehl werden die 1000 letzten Ereignisse aus dem Systemprotokoll abgerufen und in der Variablen "$events" gespeichert. Anschließend werden die Ereignisse über die Pipeline an das Cmdlet "ForEach-Object" übergeben. Der Begin-Parameter zeigt das aktuelle Datum und die aktuelle Uhrzeit an. Anschließend erstellt der Process-Parameter mit dem Cmdlet "Out-File" eine Textdatei mit dem Namen "events.txt" und speichert die Message-Eigenschaft der einzelnen Ereignisse in dieser Datei. Schließlich werden nach Abschluss der gesamten Verarbeitung mit dem End-Parameter das Datum und die Uhrzeit angezeigt.
Beispiel 4
C:\PS>get-itemproperty -path hkcu:\Network\* | foreach-object {set-itemproperty -path $_.pspath -name RemotePath -value $_.RemotePath.ToUpper();} Beschreibung ----------- Dieser Befehl ändert den Wert des Registrierungseintrags "RemotePath" in allen Unterschlüsseln unter dem Schlüssel "HKCU:\Network" in Großbuchstaben. Mit diesem Format kann Form oder Inhalt von Werten in der Registrierung geändert werden. Jeder Unterschlüssel im Schlüssel "Network" stellt ein zugeordnetes Netzlaufwerk dar, für das bei der Anmeldung erneut eine Verbindung hergestellt wird. Der RemotePath-Eintrag enthält den UNC-Pfad des verbundenen Laufwerks. Wenn Sie \\Server\Share beispielsweise das Laufwerk "E:" zuordnen, weist "HKCU:\Network" einen Unterschlüssel für das Laufwerk "E:" auf, und der Wert des Registrierungseintrags "RemotePath" im Unterschlüssel von "E:" lautet "\\Server\Share". Mit dem Cmdlet "Get-ItemProperty" werden vom Befehl alle Unterschlüssel des Schlüssels "Network" abgerufen, und mit dem Cmdlet "Set-ItemProperty" wird der Wert des Registrierungseintrags "RemotePath" in den einzelnen Schlüsseln geändert. Im Befehl "Set-ItemProperty" entspricht der Pfad dem Wert der Eigenschaft "PSPath" des Registrierungsschlüssels. (Dies ist eine Eigenschaft des Microsoft .NET Framework-Objekts, das den Registrierungsschlüssel darstellt; es handelt sich nicht um einen Registrierungseintrag.) Der Befehl verwendet die ToUpper()-Methode des RemotePath-Werts. Dabei handelt es sich um eine Zeichenfolge (REG_SZ). Da Set-ItemProperty die Eigenschaft aller Schlüssel ändert, ist das Cmdlet "ForEach-Object" erforderlich, um auf die Eigenschaft zuzugreifen.