ForEach-Object
Provede operaci s každou položkou v kolekci vstupních objektů.
Syntax
ScriptBlockSet (Výchozí)
ForEach-Object
[-Process] <ScriptBlock[]>
[-InputObject <PSObject>]
[-Begin <ScriptBlock>]
[-End <ScriptBlock>]
[-RemainingScripts <ScriptBlock[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
PropertyAndMethodSet
ForEach-Object
[-MemberName] <String>
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
ParallelParameterSet
ForEach-Object
-Parallel <ScriptBlock>
[-InputObject <PSObject>]
[-ThrottleLimit <Int32>]
[-TimeoutSeconds <Int32>]
[-AsJob]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
Description
Rutina ForEach-Object provádí operaci pro každou položku v kolekci vstupních objektů. Vstupní objekty lze předvést do rutiny nebo zadat pomocí parametru InputObject.
Počínaje windows PowerShellem 3.0 existují dva různé způsoby vytvoření příkazu ForEach-Object.
blok skriptu. K určení operace můžete použít blok skriptu. V bloku skriptu použijte proměnnou
$_k reprezentaci aktuálního objektu. Blok skriptu je hodnota parametru Process . Blok skriptu může obsahovat libovolný skript PowerShellu.Například následující příkaz získá hodnotu ProcessName vlastnost každého procesu v počítači.
Get-Process | ForEach-Object {$_.ProcessName}ForEach-Objectpodporuje blokybegin,processaend, jak je popsáno v about_functions.Poznámka:
Bloky skriptu se spouštějí v oboru volajícího. Bloky proto mají přístup k proměnným v tomto oboru a mohou vytvářet nové proměnné, které v tomto oboru zůstanou i po dokončení rutiny.
příkaz Operation. Můžete také napsat příkaz operace, což je mnohem více jako přirozený jazyk. Příkaz operace můžete použít k určení hodnoty vlastnosti nebo volání metody. Příkazy operací byly zavedeny ve Windows PowerShellu 3.0.
Například následující příkaz také získá hodnotu ProcessName vlastnost každého procesu v počítači.
Get-Process | ForEach-Object ProcessNameParalelní spuštění bloku skriptu. Počínaje PowerShellem 7.0 je k dispozici třetí sada parametrů, která spouští každý blok skriptu paralelně. Parametr ThrottleLimit omezuje počet paralelních skriptů spuštěných najednou. Stejně jako předtím použijte
$_proměnnou k reprezentaci aktuálního vstupního objektu v bloku skriptu. Pomocí klíčového slova$using:předejte do spuštěného skriptu odkazy na proměnné.V PowerShellu 7 se vytvoří nový runspace pro každou iteraci smyčky, aby se zajistila maximální izolace. To může být velký výkon a dosažení prostředků, pokud je práce, kterou děláte, malá ve srovnání s vytvářením nových prostředí runspace nebo pokud existuje velké množství iterací provádějících významnou práci. Od PowerShellu 7.1 se ve výchozím nastavení znovu používají prostory z fondu runspace. Velikost fondu prostředí runspace je určena parametrem ThrottleLimit . Výchozí velikost fondu runspace je 5. Stále můžete vytvořit nový runspace pro každou iteraci pomocí přepínače UseNewRunspace .
Ve výchozím nastavení používají paralelní bloky skriptů aktuální pracovní adresář volajícího, který spustil paralelní úlohy.
Další informace najdete v části POZNÁMKY tohoto článku.
Příklady
Příklad 1: Dělení celých čísel v matici
V tomto příkladu se používá pole se třemi celými čísly a každý z nich vydělí číslem 1024.
30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625
Příklad 2: Získání délky všech souborů v adresáři
Tento příklad zpracovává soubory a adresáře v instalačním adresáři PowerShellu $PSHOME.
Get-ChildItem $PSHOME |
ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}
Pokud objekt není adresář, blok skriptu získá název souboru, vydělí hodnotu jeho Length vlastnost 1024 a přidá mezeru (" ") k oddělení od další položky. Rutina používá vlastnost PSISContainer k určení, zda je objekt adresářem.
Příklad 3: Operace s nejnovějšími událostmi systému
Tento příklad zapíše 1000 nejnovějších událostí z protokolu událostí systému do textového souboru. Aktuální čas se zobrazí před a po zpracování událostí.
$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 získá 1000 nejnovějších událostí z protokolu událostí systému a uloží je do proměnné $Events .
$Events se pak přepošle do rutiny ForEach-Object . Parametr Begin zobrazuje aktuální datum a čas. Dále parametr Process použije rutinu Out-File k vytvoření textového souboru s názvem events.txt a uloží vlastnost zprávy všech událostí v daném souboru. Nakonec se k zobrazení data a času po dokončení veškerého zpracování použije parametr End.
Příklad 4: Změna hodnoty klíče registru
Tento příklad změní hodnotu položky registru RemotePath ve všech podklíčích pod klíčem HKCU:\Network na text psaný velkými písmeny.
Get-ItemProperty -Path HKCU:\Network\* |
ForEach-Object {Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper();}
Tento formát můžete použít ke změně formuláře nebo obsahu hodnoty položky registru.
Každý podklíč v síťovém klíči představuje namapovanou síťovou jednotku, která se znovu připojí při přihlášení. Položka RemotePath obsahuje cestu UNC připojené jednotky. Pokud například namapujete jednotku E: na \\Server\Share, vytvoří se podklíč E s HKCU:\Network hodnotou registru RemotePath nastavenou na .\\Server\Share
Příkaz používá rutinu Get-ItemProperty k získání všech podklíčů klíče Network a rutiny Set-ItemProperty ke změně hodnoty položky registru RemotePath v každém klíči.
Set-ItemProperty V příkazu je cesta hodnotou vlastnosti PSPath klíče registru. Toto je vlastnost objektu rozhraní Microsoft .NET Framework, který představuje klíč registru, nikoli položku registru. Příkaz používá metodu
Vzhledem k tomu, že Set-ItemProperty mění vlastnost každého klíče, je pro přístup k této vlastnosti nutná rutina ForEach-Object.
Příklad 5: Použití $Null automatické proměnné
Tento příklad ukazuje účinek propojení $Null automatické proměnné do rutiny ForEach-Object.
1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello
Vzhledem k tomu, že PowerShell považuje hodnotu null za explicitní zástupný symbol, ForEach-Object rutina vygeneruje hodnotu pro $Null, stejně jako u jiných objektů, které do ní předáte.
Příklad 6: Získání hodnot vlastností
Tento příklad získá hodnotu vlastnosti Path všech nainstalovaných modulů PowerShell pomocí parametru MemberName rutiny ForEach-Object .
Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path
Druhý příkaz je ekvivalentní prvnímu příkazu. Používá Foreach alias ForEach-Object rutiny a vynechá název parametru MemberName , který je volitelný.
Rutina ForEach-Object je užitečná pro získání hodnot vlastností, protože získá hodnotu beze změny typu, na rozdíl od rutin Format nebo rutiny Select-Object , která změní typ hodnoty vlastnosti.
Příklad 7: Rozdělení názvů modulů na názvy komponent
Tento příklad ukazuje tři způsoby rozdělení dvou názvů modulů oddělených tečkami na názvy komponent. Příkazy volají metodu Split řetězců. Tyto tři příkazy používají jinou syntaxi, ale jsou ekvivalentní a zaměnitelné. Výstup je stejný pro všechny tři případy.
"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
První příkaz používá tradiční syntaxi, která zahrnuje blok skriptu a aktuální operátor objektu $_. Pomocí syntaxe tečky určuje metodu a závorky k uzavření argumentu oddělovače.
Druhý příkaz používá parametr MemberName k určení Split metoda aArgumentList parametr identifikovat tečku (.) jako oddělovač rozdělení.
Třetí příkaz používá alias Foreach rutiny ForEach-Object a vynechá názvy parametrů MemberName a ArgumentList, které jsou volitelné.
Příklad 8: Použití ForEach-Object se dvěma bloky skriptu
V tomto příkladu předáme dva bloky skriptu pozičním způsobem. Všechny bloky skriptu se sváže s parametrem Process . Je s nimi ale zacházeno, jako by byly předány parametrům Begin a Process .
1..2 | ForEach-Object { 'begin' } { 'process' }
begin
process
process
Příklad 9: Použití ForEach-Object s více než dvěma bloky skriptu
V tomto příkladu předáme dva bloky skriptu pozičním způsobem. Všechny bloky skriptu se sváže s parametrem Process . Je s nimi ale zacházeno, jako by byly předány parametrům Begin, Process a End .
1..2 | ForEach-Object { 'begin' } { 'process A' } { 'process B' } { 'end' }
begin
process A
process B
process A
process B
end
Poznámka:
První blok skriptu je vždy mapován na blok, begin poslední blok je mapován na end blok a všechny bloky mezi ním jsou mapovány na blok.process
Příklad 10: Spuštění více bloků skriptů pro každou položku kanálu
Jak je znázorněno v předchozím příkladu, několik bloků skriptu předaných pomocí parametru Process se mapuje na parametry Begin a End . Chcete-li se tomuto mapování vyhnout, je nutné zadat explicitní hodnoty parametrů Begin a End .
1..2 | ForEach-Object -Begin $null -Process { 'one' }, { 'two' }, { 'three' } -End $null
one
two
three
one
two
three
Příklad 11: Spuštění pomalého skriptu v paralelních dávkách
V tomto příkladu je spuštěn jednoduchý blok skriptu, který vyhodnotí řetězec a přejde na jednu sekundu do režimu spánku.
$Message = "Output:"
1..8 | ForEach-Object -Parallel {
"$using:Message $_"
Start-Sleep 1
} -ThrottleLimit 4
Output: 1
Output: 2
Output: 3
Output: 4
Output: 5
Output: 6
Output: 7
Output: 8
Hodnota parametru ThrottleLimit je nastavena na hodnotu 4, aby se vstup zpracovával v dávkách čtyř.
Klíčové slovo $using: slouží k předání proměnné $Message do každého bloku paralelního skriptu.
Příklad 12: Paralelní načtení položek protokolu
Tento příklad načte 50 000 položek protokolu z 5 systémových protokolů na místním počítači s Windows.
$logNames = 'Security','Application','System','Windows PowerShell','Microsoft-Windows-Store/Operational'
$logEntries = $logNames | ForEach-Object -Parallel {
Get-WinEvent -LogName $_ -MaxEvents 10000
} -ThrottleLimit 5
$logEntries.Count
50000
Parametr Parallel určuje blok skriptu, který se spouští paralelně pro každý název vstupního protokolu. Parametr ThrottleLimit zajišťuje, že se současně spustí všech pět bloků skriptu.
Příklad 13: Paralelní spuštění jako úloha
V tomto příkladu je paralelně spuštěn jednoduchý blok skriptu a vytvořeny dvě úlohy na pozadí najednou.
$job = 1..10 | ForEach-Object -Parallel {
"Output: $_"
Start-Sleep 1
} -ThrottleLimit 2 -AsJob
$job | Receive-Job -Wait
Output: 1
Output: 2
Output: 3
Output: 4
Output: 5
Output: 6
Output: 7
Output: 8
Output: 9
Output: 10
Proměnná $job přijímá objekt úlohy, který shromažďuje výstupní data a monitoruje stav běhu.
Objekt úlohy je přesměrován pomocí Receive-Job parametru Wait switch. A ten streamuje výstup do konzole, jako by ForEach-Object -Parallel byl spuštěn bez AsJob.
Příklad 14: Použití odkazůnach
Tento příklad vyvolá bloky skriptu paralelně ke shromažďování jedinečných pojmenovaných objektů Process.
$threadSafeDictionary = [System.Collections.Concurrent.ConcurrentDictionary[string,object]]::new()
Get-Process | ForEach-Object -Parallel {
$dict = $using:threadSafeDictionary
$dict.TryAdd($_.ProcessName, $_)
}
$threadSafeDictionary["pwsh"]
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
82 82.87 130.85 15.55 2808 2 pwsh
Do každého bloku skriptu se předá jedna instance objektu ConcurrentDictionary , aby se objekty shromáždily. Vzhledem k tomu, že ConcurrentDictionary je bezpečný pro přístup z více vláken, je bezpečné jej upravovat každým paralelním skriptem. Objekt, který není bezpečný pro vlákno, jako je System.Collections.Generic.Dictionary, by zde nebyl bezpečný.
Poznámka:
Tento příklad je velmi neefektivní použití parametru Parallel . Skript jednoduše přidá vstupní objekt do souběžného objektu slovníku. Je to triviální a nestojí to za režii spojenou s vyvoláváním každého skriptu v samostatném vlákně. Normální chod ForEach-Object bez paralelního spínače je mnohem efektivnější a rychlejší. Tento příklad je určen pouze k předvedení použití proměnných bezpečných pro přístup z více vláken.
Příklad 15: Zápis chyb s paralelním spouštěním
Tento příklad zapisuje do datového proudu chyb paralelně, kde pořadí zapsaných chyb je náhodné.
1..3 | ForEach-Object -Parallel {
Write-Error "Error: $_"
}
Write-Error: Error: 1
Write-Error: Error: 3
Write-Error: Error: 2
Příklad 16: Ukončení chyb při paralelním spuštění
Tento příklad ukazuje ukončující chybu v jednom paralelním spuštění skriptublock.
1..5 | ForEach-Object -Parallel {
if ($_ -eq 3)
{
throw "Terminating Error: $_"
}
Write-Output "Output: $_"
}
Exception: Terminating Error: 3
Output: 1
Output: 4
Output: 2
Output: 5
Output: 3 není nikdy zapsán, protože paralelní skriptblock pro tuto iteraci byl ukončen.
Příklad 17: Předávání proměnných ve vnořeném paralelním skriptu ScriptBlockSet
Můžete vytvořit proměnnou mimo Foreach-Object -Parallel blok skriptu s vymezeným oborem a použít ji uvnitř skriptublock s klíčovým slovem $using.
$test1 = 'TestA'
1..2 | Foreach-Object -Parallel {
$using:test1
}
TestA
TestA
# 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.
Vnořený skriptblock nemá přístup k proměnné $test2 a vyvolá se chyba.
Parametry
-ArgumentList
Určuje pole argumentů pro volání metody. Další informace o chování ArgumentListnajdete v části about_Splatting.
Tento parametr byl představen ve Windows PowerShellu 3.0.
Vlastnosti parametru
| Typ: | Object[] |
| Default value: | None |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
| Aliasy: | Argumenty |
Sady parametrů
PropertyAndMethodSet
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-AsJob
Způsobí, že paralelní vyvolání se spustí jako úloha PowerShellu. Místo výstupu ze spuštěných bloků skriptu se vrátí jeden objekt úlohy. Objekt úlohy obsahuje podřízené úlohy pro každý blok paralelního skriptu, který se spouští. Objekt úlohy mohou používat všechny rutiny úloh PowerShellu ke sledování stavu běhu a načítání dat.
Tento parametr byl představen v PowerShellu 7.0.
Vlastnosti parametru
| Typ: | SwitchParameter |
| Default value: | None |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
ParallelParameterSet
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-Begin
Určuje blok skriptu, který se spustí před tím, než tato rutina zpracuje všechny vstupní objekty. Tento blok skriptu se spustí pouze jednou pro celý kanál. Další informace o begin bloku najdete v tématu about_Functions.
Vlastnosti parametru
| Typ: | ScriptBlock |
| Default value: | None |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
ScriptBlockSet
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-Confirm
Před spuštěním cmdletu vás vyzve k potvrzení.
Vlastnosti parametru
| Typ: | SwitchParameter |
| Default value: | False |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
| Aliasy: | viz |
Sady parametrů
(All)
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-End
Určuje blok skriptu, který se spustí po této rutině, zpracuje všechny vstupní objekty. Tento blok skriptu se spustí pouze jednou pro celý kanál. Další informace o end bloku najdete v tématu about_Functions.
Vlastnosti parametru
| Typ: | ScriptBlock |
| Default value: | None |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
ScriptBlockSet
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-InputObject
Určuje vstupní objekty.
ForEach-Object spustí blok skriptu nebo příkaz operace na každém vstupním objektu. Zadejte proměnnou, která obsahuje objekty, nebo zadejte příkaz nebo výraz, který objekty získá.
Pokud použijete inputObject parametr s ForEach-Object, místo piping command výsledky do ForEach-Object, InputObject hodnota je považována za jeden objekt. To platí i v případě, že hodnota je kolekce, která je výsledkem příkazu, například -InputObject (Get-Process).
Vzhledem k tomu, že InputObject nemůže vrátit jednotlivé vlastnosti z pole nebo kolekce objektů, doporučujeme použít ForEach-Object k provádění operací s kolekcí objektů pro tyto objekty, které mají určité hodnoty v definovaných vlastnostech, použijete ForEach-Object v kanálu, jak je znázorněno v příkladech v tomto tématu.
Vlastnosti parametru
| Typ: | PSObject |
| Default value: | None |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
(All)
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | True |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-MemberName
Určuje vlastnost, která se má získat, nebo metodu volání.
Jsou povoleny zástupné znaky, ale fungují pouze v případě, že se výsledný řetězec přeloží na jedinečnou hodnotu.
Pokud například spustíte Get-Process | ForEach -MemberName *Name, vzor se zástupným znakem shoduje s více než jedním členem, což způsobí selhání příkazu.
Tento parametr byl představen ve Windows PowerShellu 3.0.
Vlastnosti parametru
| Typ: | String |
| Default value: | None |
| Podporuje zástupné znaky: | True |
| DontShow: | False |
Sady parametrů
PropertyAndMethodSet
| Position: | 0 |
| Povinné: | True |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-Parallel
Určuje blok skriptu, který se má použít pro paralelní zpracování vstupních objektů. Zadejte blok skriptu, který popisuje operaci.
Tento parametr byl představen v PowerShellu 7.0.
Vlastnosti parametru
| Typ: | ScriptBlock |
| Default value: | None |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
ParallelParameterSet
| Position: | Named |
| Povinné: | True |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-Process
Určuje operaci, která se provádí u každého vstupního objektu. Tento blok skriptu se spouští pro každý objekt v kanálu. Další informace o process bloku najdete v tématu about_Functions.
Pokud do parametru Process zadáte více bloků skriptu, první blok skriptu se vždy mapuje na begin blok. Pokud existují jenom dva bloky skriptu, druhý blok se mapuje na process blok. Pokud existují tři nebo více bloků skriptu, první blok skriptu je vždy mapován na blok, begin poslední blok je mapován na end blok a všechny bloky mezi ním jsou mapovány na blok.process
Vlastnosti parametru
| Typ: | |
| Default value: | None |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
ScriptBlockSet
| Position: | 0 |
| Povinné: | True |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-RemainingScripts
Určuje všechny bloky skriptu, které nejsou převzaty parametrem Process.
Tento parametr byl představen ve Windows PowerShellu 3.0.
Vlastnosti parametru
| Typ: | |
| Default value: | None |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
ScriptBlockSet
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-ThrottleLimit
Určuje počet bloků skriptu, které jsou paralelní. Vstupní objekty jsou blokovány, dokud počet spuštěných bloků skriptu klesne pod throttleLimit. Výchozí hodnota je 5.
Tento parametr byl představen v PowerShellu 7.0.
Vlastnosti parametru
| Typ: | Int32 |
| Default value: | 5 |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
ParallelParameterSet
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-TimeoutSeconds
Určuje počet sekund, po který se má čekat na zpracování všech vstupů paralelně. Po uplynutí zadaného časového limitu se zastaví všechny spuštěné skripty. Všechny zbývající vstupní objekty, které se mají zpracovat, se ignorují. Výchozí hodnota zákazu 0 časového limitu a ForEach-Object -Parallel může běžet neomezeně dlouho. Zadáním kláves Ctrl+C na příkazovém řádku zastavíte spuštěný ForEach-Object -Parallel příkaz. Tento parametr nelze použít společně s parametrem AsJob .
Tento parametr byl představen v PowerShellu 7.0.
Vlastnosti parametru
| Typ: | Int32 |
| Default value: | 0 |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
ParallelParameterSet
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-UseNewRunspace
Způsobí, že paralelní vyvolání vytvoří nový runspace pro každou iteraci smyčky místo opakovaného použití prostorů runspace z fondu runspace.
Tento parametr byl představen v PowerShellu 7.1.
Vlastnosti parametru
| Typ: | SwitchParameter |
| Default value: | False |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
ParallelParameterSet
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-WhatIf
Ukazuje, co se stane, když se příkaz spustí. Příkazový modul nebyl spuštěn.
Vlastnosti parametru
| Typ: | SwitchParameter |
| Default value: | False |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
| Aliasy: | Wi |
Sady parametrů
(All)
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
CommonParameters
Tato rutina podporuje běžné parametry: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction a -WarningVariable. Další informace najdete v about_CommonParameters.
Vstupy
PSObject
K tomuto cmdletu můžete přesměrovat libovolný objekt.
Výstupy
PSObject
Tato rutina vrátí objekty, které jsou určeny vstupem.
Poznámky
Rutina ForEach-Object funguje podobně jako příkaz Foreach s tím rozdílem, že vstup do příkazu Foreach nelze převést. Další informace o příkazu Foreach naleznete v tématu about_Foreach.
Počínaje PowerShellem 4.0 byly přidány metody Where a ForEach pro použití s kolekcemi. Další informace o těchto nových metodách najdete about_arrays
Použití ForEach-Object -Parallel:
Sada
ForEach-Object -Parallelparametrů používá interní rozhraní API PowerShellu ke spuštění každého bloku skriptu v novém prostředí runspace. To je výrazně větší režie než při běžném běhuForEach-Objectse sekvenčním zpracováním. Je důležité použít paralelní tam, kde je režie paralelního běhu malá ve srovnání s prací, kterou provádí blok skriptu. Například:- Skripty náročné na výpočetní výkon na počítačích s více jádry
- Skripty, které tráví čas čekáním na výsledky nebo prováděním operací se soubory
Použití parametru Parallel může způsobit, že skripty běží mnohem pomaleji než obvykle. Zvláště pokud jsou paralelní skripty triviální. Experimentujte s paralelně a zjistěte, kde může být přínosné.
Při paralelním spuštění nelze zaručit správnou funkci objektů určených pomocí ScriptProperties nebo ScriptMethods , pokud jsou spuštěny v jiném prostředí runspace, než ke kterému byly skripty původně připojeny.
Vyvolání scriptblocku se vždy pokusí spustit ve svém domovském prostředí runspace bez ohledu na to, kde se skutečně vyvolá.
ForEach-Object -ParallelVytvoří však dočasné prostředí runspace, které se po použití odstraní, takže už skripty nebudou spuštěné.Toto chování může fungovat, pokud home runspace stále existuje. Požadovaný výsledek však nelze získat, pokud je skript závislý na externích proměnných, které jsou přítomné pouze v prostředí runspace volajícího, a ne na domovském prostředí runspace.
Neukončující chyby se zapisují do datového proudu chyb rutiny, protože probíhají paralelně se spouštěním skriptů. Vzhledem k tomu, že pořadí provádění paralelního bloku skriptu není deterministické, pořadí, ve kterém se chyby zobrazují v chybovém streamu, je náhodné. Podobně se zprávy zapsané do jiných datových proudů, jako jsou upozornění, podrobné nebo informace, zapisují do těchto datových proudů v neurčité pořadí.
Ukončování chyb, jako jsou výjimky, ukončete jednotlivé paralelní instance skriptů, ve kterých k nim dochází. Ukončení chyby v jednom bloku skriptu nemusí způsobit ukončení rutiny
Foreach-Object. Ostatní skripty, spuštěné paralelně, se budou dál spouštět, pokud také nenarazí na ukončující chybu. Ukončující chyba je zapsána do datového proudu chyby jako ErrorRecord s PlněQualifiedErrorId ofPSTaskException. Ukončovací chyby lze převést na neukončující chyby pomocí bloků PowerShell try/catch nebo trap.běžné proměnné parametrů PipelineVariable nejsou podporovány v paralelních scénářích ani s klíčovým slovem
$using:.Důležité
Sada
ForEach-Object -Parallelparametrů spouští bloky skriptu paralelně na samostatných vláknech procesu. Klíčové slovo$using:umožňuje předávání odkazů na proměnné z vlákna vyvolání rutiny do každého spuštěného vlákna bloku skriptu. Vzhledem k tomu, že bloky skriptu běží v různých vláknech, musí být proměnné objektů předané odkazem bezpečně použity. Obecně je bezpečné číst z odkazovaných objektů, které se nemění. Pokud se však mění stav objektu, musíte použít objekty bezpečné pro přístup z více vláken, jako jsou typy .NET System.Collection.Concurrent (viz příklad 11).