Führt einen Vorgang für jedes Element in einer Auflistung von Eingabeobjekten aus.
Syntax
ForEach-Object <ScriptBlock> >]
ForEach-Object <String> >]
ForEach-Object -Parallel <scriptblock>
Beschreibung
Das Cmdlet ForEach-Object
führt für jedes Element in einer Sammlung von Eingabeobjekten einen Vorgang aus. Die Eingabeobjekte können über die Pipeline an das Cmdlet übergeben oder mit dem InputObject-Parameter angegeben werden.
Ab Windows PowerShell 3.0 gibt es zwei verschiedene Möglichkeiten, einen ForEach-Object
Befehl zu erstellen.
-
Skriptblock. Sie können einen Skriptblock verwenden, um den Vorgang zu spezifizieren. Innerhalb des Skriptblocks verwenden Sie die Variable
$_
, um das aktuelle Objekt darzustellen. Der Skriptblock ist der Wert des ParametersProcess. Der Skriptblock kann ein beliebiges PowerShell-Skript enthalten.Beispielsweise ruft der folgende Befehl den Wert der Eigenschaft ProcessName jedes Prozesses auf dem Computer ab.
Get-Process | ForEach-Object {$_.ProcessName}
ForEach-Object
unterstützt dasbegin
process
, undend
Blöcke wie inabout_functions beschrieben.Hinweis
Die Skriptblöcke laufen im Scope des Aufrufers. Daher haben die Blöcke Zugriff auf Variablen in diesem Bereich und können neue Variablen erstellen, die nach Beendigung des Cmdlets in diesem Bereich bestehen bleiben.
-
Operationsanweisung. Sie können auch eine Operationsanweisung schreiben, die einer natürlichen Sprache sehr viel ähnlicher ist. Sie können die Operationsanweisung verwenden, um einen Eigenschaftswert anzugeben oder eine Methode aufzurufen. Operationsanweisungen wurden in Windows PowerShell 3.0 eingeführt.
Beispielsweise ruft der folgende Befehl auch den Wert der Eigenschaft „ProcessName“ jedes Prozesses auf dem Computer ab.
Get-Process | ForEach-Object ProcessName
-
Parallel laufender Skriptblock. Ab PowerShell 7.0 ist ein dritter Parametersatz verfügbar, der jeden Skriptblock parallel ausführt. Der ThrottleLimit-Parameter begrenzt die Anzahl der parallel ausgeführten Skripte zu einem Zeitpunkt. Verwenden Sie wie zuvor die Variable
$_
, um das aktuelle Eingabeobjekt im Skriptblock darzustellen. Verwenden Sie das$using:
-Schlüsselwort, um Variablenreferenzen an das laufende Skript zu übergeben.In PowerShell 7 wird für jede Schleifeniteration ein neuer Runspace erstellt, um eine maximale Isolierung zu gewährleisten.
Dies kann ein großer Leistungs- und Ressourcenschaden sein, wenn die Arbeit, die Sie ausführen, im Vergleich zum Erstellen neuer Runspaces klein ist oder wenn es viele Iterationen gibt, die erhebliche Arbeit leisten. AbPowerShell 7.1 werden Runspaces aus einem Runspace-Pool standardmäßig wiederverwendet. Die Größe des Runspace-Pools wird durch den Parameter „ThrottleLimit“ festgelegt. Die Standardgröße des Runspace-Pools ist 5. Mit dem Schalter „UseNewRunspace“ können Sie dennoch für jede Iteration einen neuen Runspace erstellen.
Standardmäßig verwenden die parallelen Skriptblöcke das aktuelle Arbeitsverzeichnis des Aufrufers, der die parallelen Aufgaben gestartet hat.
Nicht abschließende Fehler werden in den Cmdlet-Fehlerstrom geschrieben, wenn sie in parallel ausgeführten Skriptblöcken auftreten. Da die Reihenfolge der Ausführung paralleler Skriptblöcke nicht bestimmt werden kann, ist die Reihenfolge, in der Fehler im Fehlerstrom erscheinen, zufällig. Ebenso werden Meldungen, die in andere Datenströme geschrieben werden, wie Warnungen, ausführliche Informationen oder Informationen, in einer unbestimmten Reihenfolge in diese Datenströme geschrieben.
Beendende Fehler, wie z. B. Ausnahmen, beenden die einzelnen parallelen Instanzen der Skriptblöcke, in denen sie auftreten. Ein abschließender Fehler in einem Skriptblock darf nicht zum Abbruch des
Foreach-Object
-Cmdlets führen. Die anderen Skriptblöcke, die parallel ausgeführt werden, werden weiter ausgeführt, bis sie ebenfalls auf einen abbrechenden Fehler stoßen. Der abschließende Fehler wird als ErrorRecord mit einer FullyQualifiedErrorId vonPSTaskException
in den Fehlerdatenstrom geschrieben. Abschließende Fehler können mithilfe von PowerShell try/catch- oder Trap-Blöcken in nicht abschließende Fehler umgewandelt werden.
Beispiele
Beispiel 1: Teilen von Ganzzahlen in einem Array
In diesem Beispiel wird ein Array mit drei Ganzzahlen genommen und jede durch 1024 geteilt.
30000, 56798, 12432 | ForEach-Object -Process {$_/1024}29.29687555.46679687512.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, teilt den Wert der Eigenschaft „Length“ durch 1024 und fügt ein Leerzeichen (“ „) hinzu, um es vom nächsten Eintrag zu trennen. Dascmdlet verwendet die Eigenschaft PSISContainer, um festzustellen, ob es sich bei einem Objekt um ein Verzeichnis handelt.
Beispiel 3: Auf den jüngsten Systemereignissen operieren
Dieses Beispiel schreibt die 1000 jüngsten Ereignisse aus dem Systemereignisprotokoll in eine Textdatei. Die aktuelle Uhrzeit wird vor und nach der Verarbeitung der Ereignisse angezeigt.
$Events = Get-EventLog -LogName System -Newest 1000$events | ForEach-Object -Begin {Get-Date} -Process {Out-File -FilePath Events.txt -Append -InputObject $_.Message} -End {Get-Date}
Get-EventLog
holt die 1000 aktuellsten Ereignisse aus dem Systemereignisprotokoll und speichert sie in der Variablen$Events
$Events
wird dann über die Pipeline an das Cmdlet ForEach-Object
übergeben. Der Begin-Parameter zeigt das aktuelle Datum und die Uhrzeit an. Als Nächstes erstellt der Process-Parameter mit dem Cmdlet Out-File
eine Textdatei mit dem Namen events.txt und speichert die Nachrichteneigenschaft der einzelnen Ereignisse in dieser Datei. Mit dem End-Parameter werden schließlich Datum und Uhrzeit nach Abschluss der Verarbeitung angezeigt.
Beispiel 4: Ändern des Werts eines Registrierungsschlüssels
In diesem Beispiel wird der Wert des Registrierungseintrags „RemotePath“ in allen Unterschlüsseln unter dem SchlüsselHKCU:\Network
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 des Wertes eines Registrierungseintrags zu ändern.
Jeder Unterschlüssel im Schlüssel Netzwerk repräsentiert ein zugeordnetes Netzlaufwerk, das sich bei der Anmeldung neu anmeldet. Der EintragRemotePath enthält den UNC-Pfad des verbundenen Laufwerks. Wenn Sie beispielsweise das Laufwerk E:auf \\Server\Share
zuordnen, wird ein Unterschlüssel E in HKCU:\Network
mit dem Wert RemotePfadhregistry auf \\Server\Share
erstellt.
Der Befehl verwendet das Cmdlet Get-ItemProperty
, um alle Unterschlüssel des Schlüssels „Network“ abzurufen, und das Cmdlet Set-ItemProperty
, um den Wert des Registrierungseintrags „RemotePath“ in jedem Schlüssel zu ändern.
Im Befehl Set-ItemProperty
ist der Pfad der Wert der PSPath-Eigenschaft des Registrierungsschlüssels. Dies ist eine Eigenschaft des Microsoft .NET Framework-Objekts, das den Registrierungsschlüssel und nicht einen Registrierungseintrag darstellt. Der Befehl verwendet die ToUpper()-Methode des RemotePath-Werts, der eine Zeichenkette (REG_SZ) ist.
Da Set-ItemProperty
die Eigenschaft jedes Schlüssels ändert, ist das Cmdlet ForEach-Object
erforderlich, um auf die Eigenschaft zuzugreifen.
Beispiel 5: Verwenden der automatischen Variable „$Null“
In diesem Beispiel wird gezeigt, wie die automatische Variable $Null
über die Pipeline an das Cmdlet ForEach-Object
übergeben wird.
1, 2, $null, 4 | ForEach-Object {"Hello"}HelloHelloHelloHello
Da PowerShell null als expliziten Platzhalter behandelt, generiert das Cmdlet ForEach-Object
einen Wert für $Null
, genau wie bei anderen Objekten, die Sie über die Pipeline übergeben.
Beispiel 6: Abrufen von Eigenschaftswerten
In diesem Beispiel wird der Wert der Eigenschaft „Path“ aller installierten PowerShell-Module abgerufen, indem der Parameter „MemberName“ des Cmdlets ForEach-Object
verwendet wird.
Get-Module -ListAvailable | ForEach-Object -MemberName PathGet-Module -ListAvailable | Foreach Path
Der zweite Befehl entspricht dem ersten. Er verwendet den Foreach
Alias des ForEach-Object
Cmdlets und lässt den Namen des MemberName-Parameters weg, der optional ist.
Das Cmdlet „ForEach-Object
ist für das Abrufen von Eigenschaftswerten nützlich, da es den Wert abruft, ohne den Typ zu ändern, im Gegensatz zu den Cmdlets „Format“ oder „Select-Object
, die den Typ des Eigenschaftswerts ändern.
Beispiel 7: Aufteilen von Modulnamen in Komponentennamen
In diesem Beispiel werden drei Möglichkeiten zum Aufteilen von zwei durch Punkte getrennten Modulnamen in ihre Komponentennamen gezeigt.
"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 "."MicrosoftPowerShellCoreMicrosoftPowerShellHost
Die Befehle rufen die Split-Methode von Strings auf. Die drei Befehle verwenden eine unterschiedliche Syntax, sind aber gleichwertig und austauschbar.
Der erste Befehl verwendet die traditionelle Syntax, die einen Skriptblock und den aktuellen Objektoperator $_
enthält. Er verwendet die Punktsyntax, um die Methode anzugeben, und Klammern, um das Trennargument einzuschließen.
Der zweite Befehl verwendet den MemberName-Parameter, um die Split-Methode anzugeben, und denArgumentName-Parameter, um den Punkt („.“) als Trennzeichen für die Aufteilung zu identifizieren.
Der dritte Befehl verwendet den Foreach-Alias des Cmdlets ForEach-Object
und lässt die Namen der Parameter MemberName und ArgumentList weg, die optional sind.
Beispiel 8: Verwenden von ForEach-Object mit zwei Skriptblöcken
In diesem Beispiel werden zwei Skriptblöcke positionell übergeben. Alle Skriptblöcke binden an denProcess -Parameter. Sie werden jedoch so behandelt, als wären sie an die Parameter Begin undProcess übergeben worden.
1..2 | ForEach-Object { 'begin' } { 'process' }beginprocessprocess
Beispiel 9: Verwenden von ForEach-Object mit mehr als zwei Skriptblöcken
In diesem Beispiel werden zwei Skriptblöcke positionell übergeben. Alle Skriptblöcke binden an denProcess -Parameter. Sie werden jedoch so behandelt, als wären sie an die Parameter Begin,Process und End übergeben worden.
1..2 | ForEach-Object { 'begin' } { 'process A' } { 'process B' } { 'end' }beginprocess Aprocess Bprocess Aprocess Bend
Der erste Skriptblock wird immer auf den begin
Block abgebildet, der letzte Block wird auf den end
-Block abgebildet, und die Blöcke dazwischen werden alle auf den process
-Block abgebildet.
Beispiel 10: Ausführen mehrerer Skriptblöcke für jedes Pipelineelement
Wie im vorherigen Beispiel gezeigt, werden mehrere Skriptblöcke, die mit dem Parameter „Process“ ü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 $nullonetwothreeonetwothree
Beispiel 11: Langsames Skript in parallelen Stapeln ausführen
In diesem Beispiel wird ein einfacher Skriptblock ausgeführt, der eine Zeichenfolge auswertet und eine Sekunde lang schläft.
$Message = "Output:"1..8 | ForEach-Object -Parallel { "$using:Message $_" Start-Sleep 1} -ThrottleLimit 4Output: 1Output: 2Output: 3Output: 4Output: 5Output: 6Output: 7Output: 8
Der Wert des Parameters ThrottleLimit wird auf 4 gesetzt, so dass die Eingabe in Vierer-Stapeln verarbeitet wird.Das $using:
-Schlüsselwort wird verwendet, um die $Message
-Variable in jeden parallelen Skriptblock zu übergeben.
Beispiel 12: Paralleles Abrufen von Protokolleinträgen
Dieses Beispiel ruft 50.000 Protokolleinträge aus 5 Systemprotokollen auf einem lokalen Windows-Rechner ab.
$logNames = 'Security','Application','System','Windows PowerShell','Microsoft-Windows-Store/Operational'$logEntries = $logNames | ForEach-Object -Parallel { Get-WinEvent -LogName $_ -MaxEvents 10000} -ThrottleLimit 5$logEntries.Count50000
Der Parameter Parallel gibt den Skriptblock an, der für jeden Eingabeprotokollnamen parallel ausgeführt wird. Der Parameter „ThrottleLimit“ stellt sicher, dass alle fünf Skriptblöcke gleichzeitig ausgeführt werden.
Beispiel 13: Parallel als Auftrag ausführen
In diesem Beispiel wird ein einfacher Skriptblock parallel ausgeführt, wobei zwei Hintergrundaufträge gleichzeitig erstellt werden.
$job = 1..10 | ForEach-Object -Parallel { "Output: $_" Start-Sleep 1} -ThrottleLimit 2 -AsJob$job | Receive-Job -WaitOutput: 1Output: 2Output: 3Output: 4Output: 5Output: 6Output: 7Output: 8Output: 9Output: 10
Die Variable $job
empfängt das Job-Objekt, das die Ausgabedaten sammelt und den Betriebszustand überwacht.
Das Job-Objekt wird mit dem Schalterparameter Wait an Receive-Job
übergeben. Dadurch wird die Ausgabe auf die Konsole gestreamt, genauso wie wenn ForEach-Object -Parallel
ohne AsJob ausgeführt würde.
Beispiel 14: Verwendung von thread-sicheren Variablenreferenzen
In diesem Beispiel werden Skriptblöcke parallel aufgerufen, um eindeutig benannte Prozessobjekte zu sammeln.
$threadSafeDictionary = ]::new()Get-Process | ForEach-Object -Parallel { $dict = $using:threadSafeDictionary $dict.TryAdd($_.ProcessName, $_)}$threadSafeDictionaryNPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName ------ ----- ----- ------ -- -- ----------- 82 82.87 130.85 15.55 2808 2 pwsh
Eine einzelne Instanz eines ConcurrentDictionary-Objekts wird an jeden Skriptblock übergeben, um dieObjekte zu sammeln. Da das ConcurrentDictionary thread-sicher ist, kann es von jedem parallelen Skript sicher geändert werden. Ein nicht thread-sicheres Objekt, wie z. B. System.Collections.Generic.Dictionary, wäre hier nicht sicher zu verwenden.
Hinweis
Dieses Beispiel ist eine sehr ineffiziente Verwendung des Parallel-Parameters. Das Skript fügt das Eingabeobjekt einfach in ein paralleles Dictionary-Objekt ein. Es ist trivial und nicht den Overhead wert, jedes Skript in einem separaten Thread aufzurufen. Die normale Ausführung von ForEach-Object
ohne den Parallelswitch ist viel effizienter und schneller. Dieses Beispiel soll nur demonstrieren, wie manthreadsichere Variablen verwendet.
Beispiel 15: Schreiben von Fehlern mit paralleler Ausführung
Dieses Beispiel schreibt parallel in den Fehlerstrom, wobei die Reihenfolge der geschriebenen Fehler zufällig ist.
1..3 | ForEach-Object -Parallel { Write-Error "Error: $_"}Write-Error: Error: 1Write-Error: Error: 3Write-Error: Error: 2
Beispiel 16: Beenden von Fehlern bei paralleler Ausführung
Dieses Beispiel demonstriert einen beendenden Fehler in einem parallel laufenden Skriptblock.
1..5 | ForEach-Object -Parallel { if ($_ -eq 3) { throw "Terminating Error: $_" } Write-Output "Output: $_"}Exception: Terminating Error: 3Output: 1Output: 4Output: 2Output: 5
Output: 3
wird nie geschrieben, da der parallele Skriptblock für diese Iteration beendet wurde.
Beispiel 17: Übergabe von Variablen in verschachtelten parallelen Skriptblöcken
Sie können eine Variable außerhalb eines Foreach-Object -Parallel
skalierten Skriptblocks erstellen und sie innerhalb des Skriptblocks mit dem Schlüsselwort $using
verwenden.
$test1 = 'TestA'1..2 | Foreach-Object -Parallel { $using:test1}TestATestA# You CANNOT create a variable inside a scoped scriptblock# to be used in a nested foreach parallel scriptblock.$test1 = 'TestA'1..2 | Foreach-Object -Parallel { $using:test1 $test2 = 'TestB' 1..2 | Foreach-Object -Parallel { $using:test2 }}Line | 2 | 1..2 | Foreach-Object -Parallel { | ~~~~~~~~~~~~~~~~~~~~~~~~~~ | The value of the using variable '$using:test2' cannot be retrieved because it has not been set in the local session.
Der verschachtelte Skriptblock kann nicht auf die $test2
-Variable zugreifen und ein Fehler wird ausgelöst.
Parameter
Spezifiziert ein Array von Argumenten für einen Methodenaufruf. Weitere Informationen über das Verhalten vonArgumentList finden Sie unter about_Splatting.
Dieser Parameter wurde in Windows PowerShell 3.0 eingeführt.
Typ: | Aliases: | Args |
Position: | Benannt |
Standardwert: | Keine |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Verursacht, dass der parallele Aufruf als PowerShell-Auftrag ausgeführt wird. Ein einzelnes Auftragsobjekt wird anstelle der Ausgabe der laufenden Skriptblöcke zurückgegeben. Das Auftragsobjekt enthält untergeordnete Aufträge für jeden ausgeführten Parallelscript-Block. Das Auftragsobjekt kann von allen PowerShell-Auftrags-Cmdlets verwendet werden, um den Laufstatus zu überwachen und Daten abzurufen.
Dieser Parameter wurde in PowerShell 7.0 eingeführt.
Typ: | SwitchParameter |
Position: | Benannt |
Standardwert: | Keine |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Spezifiziert einen Skriptblock, der ausgeführt wird, bevor dieses Cmdlet irgendwelche Eingabeobjekte verarbeitet. Dieser Skriptblock wird nur einmal für die gesamte Pipeline ausgeführt. Weitere Informationen über den begin
-Block finden Sie unterabout_Functions.
Typ: | ScriptBlock |
Position: | Benannt |
Standardwert: | Keine |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Vor der Ausführung des Cmdlets werden Sie zur Bestätigung aufgefordert.
Typ: | SwitchParameter |
Aliases: | cf |
Position: | Benannt |
Standardwert: | False |
Accept pipeline input: | Falsch |
Platzhalterzeichen akzeptieren: | Falsch |
Spezifiziert einen Skriptblock, 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 über den end
-Block finden Sie unterabout_Functions.
Typ: | ScriptBlock |
Position: | Benannt |
Standardwert: | Keine |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Spezifiziert die Eingabeobjekte. ForEach-Object
führt den Skriptblock oder die Operationsanweisung auf jedem Eingabeobjekt aus. Geben Sie eine Variable ein, die die Objekte enthält, oder geben Sie einen Befehl oder Ausdruck ein, der die Objekte abruft.
Wenn Sie den InputObject-Parameter mit ForEach-Object
verwenden, wird der InputObject-Wert als einzelnes Objekt behandelt, anstatt die Befehlsergebnisse an ForEach-Object
zu leiten. Dies gilt auch dann, wenn der Wert eine Auflistung ist, die das Ergebnis eines Befehls ist, wie z. B. -InputObject (Get-Process)
.Da InputObject keine einzelnen Eigenschaften aus einem Array oder einer Sammlung von Objekten zurückgeben kann, empfehlen wir, dass Sie, wenn Sie ForEach-Object
verwenden, um Operationen auf einer Sammlung von Objekten auszuführen, die bestimmte Werte in definierten Eigenschaften haben, ForEach-Object
in der Pipeline verwenden, wie in den Beispielen in diesem Thema gezeigt.
Typ: | PSObjekt |
Position: | Benannt |
Standardwert: | Keine |
Accept pipeline input: | True |
Accept wildcard characters: | False |
Spezifiziert die Eigenschaft, die abgerufen oder die Methode, die aufgerufen werden soll.
Wildcard-Zeichen sind zulässig, funktionieren aber nur, wenn die resultierende Zeichenfolge in einen eindeutigen Wert aufgelöst wird.
Wenn Sie beispielsweise Get-Process | ForEach -MemberName *Name
ausführen, stimmt das Wildcard-Muster mit mehr als einem Mitglied überein, wodurch der Befehl fehlschlägt.
Dieser Parameter wurde in Windows PowerShell 3.0 eingeführt.
Typ: | ||
Position: | 0 | |
Standardwert: | Keine | Pipeline-Eingabe akzeptieren: | False |
Accept wildcard characters: | True |
Spezifiziert den Skriptblock, der für die parallele Verarbeitung von Eingabeobjekten verwendet werden soll. Geben Sie einen Skriptblock ein, der den Vorgang beschreibt.
Dieser Parameter wurde in PowerShell 7.0 eingeführt.
Typ: | ScriptBlock |
Position: | Benannt |
Standardwert: | Keine |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Spezifiziert die Operation, die auf jedem Eingabeobjekt ausgeführt wird. Dieser Skriptblock wird für jedesObjekt in der Pipeline ausgeführt. Weitere Informationen über den process
-Block finden Sie unter Über_Funktionen.
Wenn Sie dem Parameter Process mehrere Skriptblöcke übergeben, wird der erste Skriptblock immer dem begin
-Block zugeordnet. Wenn es nur zwei Skriptblöcke gibt, wird der zweite Block dem process
-Block zugeordnet. Wenn es drei oder mehr Skriptblöcke gibt, wird der erste Skriptblock immer dem begin
-Block zugeordnet, der letzte Block wird dem end
-Block zugeordnet und die Blöcke dazwischen werden alle dem process
-Block zugeordnet.
Typ: | ScriptBlock |
Position: | 0 |
Standardwert: | Keine |
Akzeptiere Pipeline-Eingabe: | False |
Accept wildcard characters: | False |
Dieser Parameter gibt alle Skriptblöcke an, die nicht vom Parameter Process übernommen werden.
Dieser Parameter wurde in Windows PowerShell 3.0 eingeführt.
Typ: | ScriptBlock |
Position: | Benannt |
Standardwert: | Keine |
Akzeptiere Pipeline-Eingabe: | False |
Accept wildcard characters: | False |
Steuert die Anzahl der Skriptblöcke, die parallel laufen. Eingabeobjekte werden blockiert, bis die Anzahl der laufenden Skriptblöcke unter das ThrottleLimit fällt. Der Standardwert ist 5
.
Dieser Parameter wurde in PowerShell 7.0 eingeführt.
Typ: | Int32 |
Position: | Benannt |
Standardwert: | 5 |
Akzeptiere Pipeline-Eingabe: | False |
Accept wildcard characters: | False |
Legt die Anzahl der Sekunden fest, die gewartet wird, bis alle Eingaben parallel verarbeitet werden. Nach der angegebenen Timeout-Zeit werden alle laufenden Skripte angehalten. Und alle verbleibenden zu verarbeitenden Eingabeobjekte werden ignoriert. Der Standardwert 0
deaktiviert den Timeout, und ForEach-Object -Parallel
kann unbegrenzt laufen. Die Eingabe von Strg+C in der Befehlszeile stoppt einen laufendenForEach-Object -Parallel
Befehl. Dieser Parameter kann nicht zusammen mit dem AsJob-Parameter verwendet werden.
Dieser Parameter wurde in PowerShell 7.0 eingeführt.
Typ: | Int32 |
Position: | Benannt |
Standardwert: | 0 |
Pipeline-Eingabe akzeptieren: | False |
Accept wildcard characters: | False |
Zeigt an, was bei Ausführung des Cmdlets passieren würde. Das Cmdlet wird nicht ausgeführt.
Typ: | SwitchParameter |
Aliases: | wi |
Position: | Benannt |
Standardwert: | False |
Accept pipeline input: | Falsch |
Akzeptiere Platzhalterzeichen: | Falsch |
Eingaben
PSObject
Sie können ein beliebiges Objekt über die Pipeline an dieses Cmdlet übergeben.
Ausgaben
PSObject
Dieses Cmdlet gibt Objekte zurück, die durch die Eingabe bestimmt werden.
Hinweise
-
Das Cmdlet
ForEach-Object
funktioniert ähnlich wie die Foreach-Anweisung, außer dass Sie keine Eingaben über die Pipeline an eine Foreach-Anweisung übergeben können. Weitere Informationen über die Foreach-Anweisung finden Sie unterabout_Foreach. -
Beginnend mit PowerShell 4.0 wurden die Methoden
Where
undForEach
für die Verwendung mit Sammlungen hinzugefügt. Mehr über diese neuen Methoden können Sie hier nachlesen: about_arrays -
Der
ForEach-Object -Parallel
-Parametersatz verwendet die interne API der PowerShell, um jeden Skriptblock auszuführen. Dies ist deutlich mehr Overhead als die normale Ausführung vonForEach-Object
mit sequenzieller Verarbeitung. Es ist wichtig, Parallel zu verwenden, wenn der Overhead der parallelen Ausführung klein ist im Vergleich zur Arbeit, die der Skriptblock ausführt. Zum Beispiel:- Rechenintensive Skripte auf Multi-Core-Maschinen
- Skripte, die Zeit mit dem Warten auf Ergebnisse oder mit Dateioperationen verbringen
Die Verwendung des Parameters „Parallel“ kann dazu führen, dass Skripte viel langsamer als normal ausgeführt werden. Vor allem, wenn die parallelen Skripte trivial sind. Experimentieren Sie mit Parallel, um herauszufinden, wo es von Vorteil sein kann.
Wichtig
Der
ForEach-Object -Parallel
-Parametersatz führt Skriptblöcke parallel auf separaten Prozessthreads aus. Das$using:
-Schlüsselwort ermöglicht die Übergabe von Variablenreferenzen vom Cmdlet-Aufrufthread an jeden laufenden Skriptblock-Thread. Da die Skriptblöcke in verschiedenen Threads ausgeführt werden, müssen die per Referenz übergebenen Objektvariablen sicher verwendet werden. Im Allgemeinen ist es sicher, von referenzierten Objekten zu lesen, die sich nicht ändern. Wenn sich aber der Objektzustand ändert, müssen Sie thread-sichere Objekte verwenden, wie zum Beispiel .Net System.Collection.Concurrent-Typen (siehe Beispiel 11).
- Vergleichsobjekt
- Wo-Objekt
- Gruppenobjekt
- Messobjekt
- Neu-Objekt
- Auswahl-Objekt
- Sortierobjekt
- Tee-Objekt