ForEach-Object
Führt einen Vorgang für jedes Element in einer Auflistung von Eingabeobjekten aus.
Syntax
ForEach-Object
[-InputObject <PSObject>]
[-Begin <ScriptBlock>]
[-Process] <ScriptBlock[]>
[-End <ScriptBlock>]
[-RemainingScripts <ScriptBlock[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
ForEach-Object
[-InputObject <PSObject>]
[-MemberName] <String>
[-ArgumentList <Object[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
Beschreibung
Das ForEach-Object
Cmdlet führt einen Vorgang für jedes Element in einer Sammlung von Eingabeobjekten aus. Die Eingabeobjekte können an das Cmdlet weitergeleitet oder mithilfe des InputObject-Parameters angegeben werden.
Ab Windows PowerShell 3.0 gibt es zwei verschiedene Möglichkeiten zum Erstellen eines ForEach-Object
Befehls.
Skriptblock. Sie können einen Skriptblock verwenden, um den Vorgang anzugeben. Verwenden Sie innerhalb des Skriptblocks die
$_
Variable, um das aktuelle Objekt darzustellen. Der Skriptblock ist der Wert des Process-Parameters . Der Skriptblock kann ein beliebiges PowerShell-Skript enthalten.Der folgende Befehl ruft beispielsweise den Wert der ProcessName-Eigenschaft jedes Prozesses auf dem Computer ab.
Get-Process | ForEach-Object {$_.ProcessName}
ForEach-Object
unterstützt diebegin
inprocess
about_functions beschriebenen Blöcke undend
Blöcke.Hinweis
Die Skriptblöcke werden im Bereich des Aufrufers ausgeführt. Daher haben die Blöcke Zugriff auf Variablen in diesem Bereich und können neue Variablen erstellen, die nach Abschluss des Cmdlets in diesem Bereich beibehalten werden.
Operation-Anweisung. Sie können auch eine Vorgangsanweisung schreiben, die viel ähnlich wie natürliche Sprache ist. Sie können die Vorgangsanweisung verwenden, um einen Eigenschaftenwert anzugeben oder eine Methode aufzurufen. Vorgangsanweisungen wurden in Windows PowerShell 3.0 eingeführt.
Der folgende Befehl ruft beispielsweise auch den Wert der ProcessName-Eigenschaft jedes Prozesses auf dem Computer ab.
Get-Process | ForEach-Object ProcessName
Beispiele
Beispiel 1: Dividieren ganzzahliger Zahlen in einem Array
In diesem Beispiel wird ein Array mit drei ganzzahligen Zahlen verwendet und jede von ihnen durch 1024 dividiert.
30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625
Beispiel 2: Abrufen der Länge aller Dateien in einem Verzeichnis
In diesem Beispiel werden die Dateien und Verzeichnisse im PowerShell-Installationsverzeichnis $PSHOME
verarbeitet.
Get-ChildItem $PSHOME |
ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}
Wenn das Objekt kein Verzeichnis ist, ruft der Skriptblock den Namen der Datei ab, dividiert den Wert der Length-Eigenschaft durch 1024 und fügt ein Leerzeichen (" ") hinzu, um es vom nächsten Eintrag zu trennen. Das Cmdlet verwendet die PSISContainer-Eigenschaft , um zu bestimmen, ob ein Objekt ein Verzeichnis ist.
Beispiel 3: Arbeiten mit den neuesten Systemereignissen
In diesem Beispiel werden die 1000 neuesten Ereignisse aus dem Systemereignisprotokoll in eine Textdatei geschrieben. Die aktuelle Uhrzeit wird vor und nach der Verarbeitung der Ereignisse angezeigt.
Get-EventLog -LogName System -Newest 1000 |
ForEach-Object -Begin {Get-Date} -Process {
Out-File -FilePath Events.txt -Append -InputObject $_.Message
} -End {Get-Date}
Get-EventLog
ruft die 1000 neuesten Ereignisse aus dem Systemereignisprotokoll ab und übergibt sie an das ForEach-Object
Cmdlet. Der Begin-Parameter zeigt das aktuelle Datum und die aktuelle Uhrzeit an. Als Nächstes verwendet der Process-Parameter das Out-File
Cmdlet, um eine Textdatei mit dem Namen events.txt zu erstellen und die Nachrichteneigenschaft der einzelnen Ereignisse in dieser Datei zu speichern. Zuletzt wird der End-Parameter verwendet, um das Datum und die Uhrzeit anzuzeigen, nachdem die gesamte Verarbeitung abgeschlossen wurde.
Beispiel 4: Ändern des Werts eines Registrierungsschlüssels
In diesem Beispiel wird der Wert des RemotePath-Registrierungseintrags in allen Unterschlüsseln unter dem HKCU:\Network
Schlüssel in Großbuchstaben geändert.
Get-ItemProperty -Path HKCU:\Network\* |
ForEach-Object {
Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper()
}
Sie können dieses Format verwenden,um die Form oder den Inhalt eines Registrierungseintragswerts zu ändern.
Jeder Unterschlüssel im Netzwerkschlüssel stellt ein zugeordnetes Netzlaufwerk dar, das bei der Anmeldung erneut eine Verbindung herstellt. Der RemotePath-Eintrag enthält den UNC-Pfad des verbundenen Laufwerks. Wenn Sie das E:
Laufwerk \\Server\Share
z. B. zuordnen, wird ein E-Unterschlüssel erstellt, in HKCU:\Network
dem der Registrierungswert "RemotePath " auf " \\Server\Share
.
Der Befehl verwendet das Get-ItemProperty
Cmdlet, um alle Unterschlüssel des Netzwerkschlüssels und das Set-ItemProperty
Cmdlet abzurufen, um den Wert des RemotePath-Registrierungseintrags in jedem Schlüssel zu ändern. Set-ItemProperty
Im Befehl ist der Pfad der PSPath-Eigenschaft des Registrierungsschlüssels. Dies ist eine Eigenschaft des Microsoft .NET Framework-Objekts, das den Registrierungsschlüssel und keinen Registrierungseintrag darstellt. Der Befehl verwendet die ToUpper()- Methode des RemotePath-Werts , bei dem es sich um eine Zeichenfolge REG_SZ handelt.
Da Set-ItemProperty
die Eigenschaft jedes Schlüssels geändert wird, ist das ForEach-Object
Cmdlet erforderlich, um auf die Eigenschaft zuzugreifen.
Beispiel 5: Verwenden der $null automatischen Variablen
In diesem Beispiel wird die Auswirkung der Verleitung der $null
automatischen Variablen an das ForEach-Object
Cmdlet veranschaulicht.
1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello
Da PowerShell als expliziter Platzhalter behandelt wird $null
, generiert das ForEach-Object
Cmdlet einen Wert wie $null
für andere Objekte, die an ihn weitergeleitet werden.
Beispiel 6: Abrufen von Eigenschaftswerten
In diesem Beispiel wird der Wert der Path-Eigenschaft aller installierten PowerShell-Module mithilfe des MemberName-Parameters des ForEach-Object
Cmdlets abgerufen.
Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path
Der zweite Befehl entspricht dem ersten. Er verwendet den Foreach
Alias des ForEach-Object
Cmdlets und übergibt den Namen des MemberName-Parameters , der optional ist.
Das ForEach-Object
Cmdlet ist nützlich für das Abrufen von Eigenschaftswerten, da er den Wert erhält, ohne den Typ zu ändern, im Gegensatz zu den Format-Cmdlets oder dem Select-Object
Cmdlet, die den Eigenschaftswerttyp ändern.
Beispiel 7: Aufteilen von Modulnamen in Komponentennamen
In diesem Beispiel werden drei Methoden gezeigt, um zwei punkttrennte Modulnamen in ihre Komponentennamen aufzuteilen. Die Befehle rufen die Split-Methode von Zeichenfolgen auf. Die drei Befehle verwenden unterschiedliche Syntax, sind aber äquivalent und austauschbar. Die Ausgabe ist für alle drei Fälle identisch.
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" |
ForEach-Object {$_.Split(".")}
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" |
ForEach-Object -MemberName Split -ArgumentList "."
"Microsoft.PowerShell.Core", "Microsoft.PowerShell.Host" |
Foreach Split "."
Microsoft
PowerShell
Core
Microsoft
PowerShell
Host
Der erste Befehl verwendet die herkömmliche Syntax, die einen Skriptblock und den aktuellen Objektoperator $_
enthält. Es verwendet die Punktsyntax zum Angeben der Methode und die Klammern, um das Trennzeichenargument einzuschließen.
Der zweite Befehl verwendet den MemberName-Parameter , um die Split-Methode und den ArgumentList-Parameter anzugeben, um den Punkt (.
) als Trennzeichen zu identifizieren.
Der dritte Befehl verwendet den Foreach-Alias des ForEach-Object
Cmdlets und lässt die Namen der Parameter "MemberName " und "ArgumentList " aus, die optional sind.
Beispiel 8: Verwenden des ForEach-Objekts mit zwei Skriptblöcken
In diesem Beispiel übergeben wir zwei Skriptblöcke positional. Alle Skriptblöcke binden an den Process-Parameter . Sie werden jedoch so behandelt, als wären sie an die Parameter "Begin " und "Process " übergeben worden.
1..2 | ForEach-Object { 'begin' } { 'process' }
begin
process
process
Beispiel 9: Verwenden des ForEach-Objekts mit mehr als zwei Skriptblöcken
In diesem Beispiel übergeben wir vier Skriptblöcke positional. Alle Skriptblöcke binden an den Process-Parameter . Sie werden jedoch so behandelt, als ob sie an die Parameter "Begin", "Process" und "End " übergeben wurden.
1..2 | ForEach-Object { 'begin' } { 'process A' } { 'process B' } { 'end' }
begin
process A
process B
process A
process B
end
Hinweis
Der erste Skriptblock wird immer dem begin
Block zugeordnet, der letzte Block wird dem end
Block zugeordnet, und die beiden mittleren Blöcke werden dem process
Block zugeordnet.
Beispiel 10: Ausführen mehrerer Skriptblöcke für jedes Pipelineelement
Wie im vorherigen Beispiel gezeigt, werden mehrere Skriptblöcke, die mithilfe des Process-Parameters übergeben werden, den Parametern "Begin" und "End " zugeordnet. Um diese Zuordnung zu vermeiden, müssen Sie explizite Werte für die Parameter "Begin" und "End " angeben.
1..2 | ForEach-Object -Begin $null -Process { 'one' }, { 'two' }, { 'three' } -End $null
one
two
three
one
two
three
Parameter
-ArgumentList
Gibt ein Array von Argumenten für einen Methodenaufruf an. Weitere Informationen zum Verhalten von ArgumentList finden Sie unter about_Splatting.
Dieser Parameter wurde in Windows PowerShell 3.0 eingeführt.
Typ: | Object[] |
Aliase: | Args |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-Begin
Gibt einen Skriptblock an, der ausgeführt wird, bevor dieses Cmdlet Eingabeobjekte verarbeitet. Dieser Skriptblock wird nur einmal für die gesamte Pipeline ausgeführt. Weitere Informationen zum begin
Block finden Sie unter about_Functions.
Typ: | ScriptBlock |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-Confirm
Hiermit werden Sie vor der Ausführung des Cmdlets zur Bestätigung aufgefordert.
Typ: | SwitchParameter |
Aliase: | cf |
Position: | Named |
Standardwert: | False |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-End
Gibt einen Skriptblock an, der ausgeführt wird, nachdem dieses Cmdlet alle Eingabeobjekte verarbeitet hat. Dieser Skriptblock wird nur einmal für die gesamte Pipeline ausgeführt. Weitere Informationen zum end
Block finden Sie unter about_Functions.
Typ: | ScriptBlock |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-InputObject
Gibt die Eingabeobjekte an. ForEach-Object
führt die Skriptblock- oder Operationsanweisung für jedes Eingabeobjekt aus. 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.
Wenn Sie den InputObject-Parameter mit ForEach-Object
, anstelle von Befehlsergebnissen ForEach-Object
an die Leitung, verwenden, wird der InputObject-Wert als einzelnes Objekt behandelt. Dies gilt auch dann, wenn es sich bei dem Wert um eine Auflistung handelt, die das Ergebnis eines Befehls ist, z -InputObject (Get-Process)
. B. .
Da InputObject keine einzelnen Eigenschaften aus einem Array oder einer Auflistung von Objekten zurückgeben kann, empfehlen wir, dass Sie ForEach-Object
, wie in den Beispielen in diesem Thema gezeigt, Vorgänge für eine Auflistung von Objekten für objekte ausführen, die bestimmte Werte in definierten Eigenschaften aufweisen, in der Pipeline verwenden ForEach-Object
.
Typ: | PSObject |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | True |
Platzhalterzeichen akzeptieren: | False |
-MemberName
Gibt den Namen der Membereigenschaft an, die aufgerufen werden soll, oder die Elementmethode, die aufgerufen werden soll. Die Member müssen Instanzm, nicht statische Member sein.
Wildcardzeichen sind zulässig, funktionieren jedoch nur, wenn die resultierende Zeichenfolge in einen eindeutigen Wert aufgelöst wird.
Wenn Sie z. B. ausführen Get-Process | ForEach -MemberName *Name
, entspricht das Wildcardmuster mehreren Membern, die dazu führen, dass der Befehl fehlschlägt.
Dieser Parameter wurde in Windows PowerShell 3.0 eingeführt.
Typ: | String |
Position: | 0 |
Standardwert: | None |
Erforderlich: | True |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | True |
-Process
Gibt den Vorgang an, der für jedes Eingabeobjekt ausgeführt wird. Dieser Skriptblock wird für jedes Objekt in der Pipeline ausgeführt. Weitere Informationen zum process
Block finden Sie unter about_Functions.
Wenn Sie dem Process-Parameter mehrere Skriptblöcke bereitstellen, wird der erste Skriptblock immer dem begin
Block zugeordnet. Wenn nur zwei Skriptblöcke vorhanden sind, wird der zweite Block dem process
Block zugeordnet. Wenn drei oder mehr Skriptblöcke vorhanden sind, wird der erste Skriptblock immer dem begin
Block zugeordnet, der letzte Block wird dem end
Block zugeordnet, und die mittleren Blöcke werden dem process
Block zugeordnet.
Typ: | ScriptBlock[] |
Position: | 0 |
Standardwert: | None |
Erforderlich: | True |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-RemainingScripts
Gibt alle Skriptblöcke an, die nicht vom Process-Parameter übernommen werden.
Dieser Parameter wurde in Windows PowerShell 3.0 eingeführt.
Typ: | ScriptBlock[] |
Position: | Named |
Standardwert: | None |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
-WhatIf
Zeigt, was geschieht, wenn das Cmdlet ausgeführt wird. Das Cmdlet wird nicht ausgeführt.
Typ: | SwitchParameter |
Aliase: | wi |
Position: | Named |
Standardwert: | False |
Erforderlich: | False |
Pipelineeingabe akzeptieren: | False |
Platzhalterzeichen akzeptieren: | False |
Eingaben
Sie können jedes Objekt an dieses Cmdlet weiterleiten.
Ausgaben
Dieses Cmdlet gibt Objekte zurück, die von der Eingabe bestimmt werden.
Hinweise
Windows PowerShell enthält die folgenden Aliase für ForEach-Object
:
%
foreach
Das ForEach-Object
Cmdlet funktioniert ähnlich wie die Foreach-Anweisung , mit der Ausnahme, dass Sie keine Eingabe an eine Foreach-Anweisung weiterleiten können. Weitere Informationen zur Foreach-Anweisung finden Sie unter about_Foreach.
Ab PowerShell 4.0 Where
ForEach
wurden Methoden für die Verwendung mit Sammlungen hinzugefügt. Weitere Informationen zu diesen neuen Methoden finden Sie hier about_arrays