ForEach-Object
Műveletet hajt végre a bemeneti objektumok gyűjteményének egyes elemein.
Syntax
ScriptBlockSet (Alapértelmezett)
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 <int>]
[-TimeoutSeconds <int>]
[-AsJob]
[-UseNewRunspace]
[-WhatIf]
[-Confirm]
[<CommonParameters>]
Description
A ForEach-Object parancsmag egy bemeneti objektumgyűjtemény minden elemén végrehajt egy műveletet. A bemeneti objektumok a parancsmagba csövezhetők, vagy az InputObject paraméterrel adhatók meg.
A Windows PowerShell 3.0-tól kezdve két különböző módon hozhat létre ForEach-Object parancsokat.
Szkriptblokk szintaxisa. A művelet megadásához szkriptblokkot használhat. A szkriptblokkon belül használja a változót
$_az aktuális objektum megjelenítéséhez. A szkriptblokk a Folyamat paraméter értéke. A szkriptblokk bármilyen PowerShell-szkriptet tartalmazhat.A következő parancs például lekéri a számítógépen található egyes folyamatok ProcessName tulajdonságának értékét.
Get-Process | ForEach-Object {$_.ProcessName}ForEach-Objecttámogatja abegin,processésendblokkokat a about_Functions.Megjegyzés:
A szkriptblokkok a hívó hatókörében futnak. Ezért a blokkok hozzáféréssel rendelkeznek a hatókör változóihoz, és új változókat hozhatnak létre, amelyek a parancsmag befejeződése után is megmaradnak a hatókörben.
Egyszerűsített szintaxis. Az egyszerűsített szintaxis használatával megadhatja a folyamat objektumának tulajdonságát vagy metódusnevét.
ForEach-ObjectA folyamat minden objektumának tulajdonságát vagy metódusát adja vissza.A következő parancs például a számítógépen található egyes folyamatok ProcessName tulajdonságának értékét is lekéri.
Get-Process | ForEach-Object ProcessNameAz egyszerűsített szintaxis a Windows PowerShell 3.0-ban lett bevezetve. További információ: about_Simplified_Syntax.
Párhuzamos futó szkriptblokk. A PowerShell 7.0-tól kezdve egy harmadik paraméterkészlet érhető el, amely az egyes szkriptblokkokat párhuzamosan futtatja. A ThrottleLimit paraméter korlátozza az egyszerre futó párhuzamos szkriptek számát. Mint korábban, a
$_változóval a szkriptblokk aktuális bemeneti objektumát jelölheti.Using:A hatókör-módosító használatával változóhivatkozásokat adhat át a futó szkriptnek.A PowerShell 7-ben minden ciklus iterációjához új futtatótér jön létre a maximális elkülönítés biztosítása érdekében. Ez nagy teljesítmény- és erőforrás-találat lehet, ha a végzett munka kicsi az új futtatóterek létrehozásához képest, vagy ha sok iteráció végez jelentős munkát. A PowerShell 7.1-től kezdve a rendszer alapértelmezés szerint újra felhasználja a runspace-készletből származó runspace-eket. A ThrottleLimit paraméter beállítja a futtatótérkészlet méretét. Az alapértelmezett futtatótérkészlet mérete 5. A UseNewRunspace kapcsolóval továbbra is létrehozhat egy új futtatóteret minden iterációhoz.
Alapértelmezés szerint a párhuzamos szkriptblokkok a párhuzamos feladatokat kezdeményező hívó aktuális munkakönyvtárát használják.
További információkért tekintse meg a cikk NOTES szakaszát.
Példák
1. példa: Egész számok osztása tömbben
Ez a példa három egész számból álló tömböt vesz fel, és mindegyiket 1024-sel osztja el.
30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625
2. példa: A könyvtárban lévő összes fájl hosszának lekérése
Ez a példa a PowerShell telepítési könyvtárában $PSHOMElévő fájlokat és könyvtárakat dolgozza fel.
Get-ChildItem $PSHOME | ForEach-Object -Process {
if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }
}
Ha az objektum nem könyvtár, a szkriptblokk lekéri a fájl nevét, 1024-tel osztja el a Hossz tulajdonság értékét, és hozzáad egy szóközt (" ") a következő bejegyzéstől való elválasztásához. A parancsmag a PSIsContainer tulajdonsággal határozza meg, hogy egy objektum könyvtár-e.
3. példa: A legutóbbi rendszeresemények üzemeltetése
Ez a példa a Rendszer eseménynaplójának 1000 legutóbbi eseményét írja egy szövegfájlba. Az aktuális idő az események feldolgozása előtt és után jelenik meg.
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 lekéri az 1000 legutóbbi eseményt a rendszer eseménynaplójából, és a parancsmagba csövezi őket ForEach-Object . A Begin paraméter megjeleníti az aktuális dátumot és időpontot. Ezután a Folyamat paraméter a Out-File parancsmaggal hoz létre egy events.txt nevű szövegfájlt, és tárolja az egyes események üzenettulajdonságait a fájlban. Végül a Vég paraméter a feldolgozás befejezése utáni dátumot és időt jeleníti meg.
4. példa: Beállításkulcs értékének módosítása
Ez a példa a RemotePath beállításjegyzék-bejegyzés értékét a kulcs alatti HKCU:\Network összes alkulcsban nagybetűs szövegre módosítja.
Get-ItemProperty -Path HKCU:\Network\* |
ForEach-Object {
Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper()
}
Ezzel a formátummal módosíthatja egy beállításjegyzék-bejegyzés értékének űrlapját vagy tartalmát.
A Hálózati kulcs minden alkulcsa egy leképezett hálózati meghajtót jelöl, amely a bejelentkezéskor újracsatlakozik. A RemotePath bejegyzés a csatlakoztatott meghajtó UNC elérési útját tartalmazza. Ha például leképezi a E: meghajtót \\Server\Share, egy E alkulcs jön létre HKCU:\Network a RemotePath beállításjegyzékének értékeként \\Server\Share.
A parancs a Get-ItemProperty parancsmaggal lekéri a Hálózati kulcs és a Set-ItemProperty parancsmag összes alkulcsát, hogy az egyes kulcsokban módosítsa a RemotePath beállításjegyzék-bejegyzésének értékét.
Set-ItemProperty A parancsban az elérési út a beállításkulcs PSPath tulajdonságának értéke. Ez a Microsoft .NET Framework objektum tulajdonsága, amely a beállításkulcsot jelöli, nem pedig a beállításjegyzék-bejegyzést. A parancs a RemotePath érték ToUpper() metódusát használja, amely egy sztring REG_SZ.
Mivel Set-ItemProperty az egyes kulcsok tulajdonságát módosítja, a ForEach-Object parancsmagnak hozzá kell férnie a tulajdonsághoz.
5. példa: Az $null automatikus változó használata
Ez a példa azt mutatja be, hogy milyen hatással van az $null automatikus változó a ForEach-Object parancsmagra.
1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello
Mivel a PowerShell explicit helyőrzőként kezeli $null , a ForEach-Object parancsmag olyan értéket $null hoz létre, mint a más, rá irányuló objektumok esetében.
6. példa: Tulajdonságértékek lekérése
Ez a példa a parancsmag MemberName paraméterével lekéri az összes telepített PowerShell-modul Path tulajdonságának ForEach-Object értékét.
Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | foreach Path
A második parancs egyenértékű az első paranccsal. A parancsmag aliasát Foreach használjaForEach-Object, és kihagyja a MemberName paraméter nevét, ami nem kötelező.
A ForEach-Object parancsmag a tulajdonságértékek lekéréséhez hasznos, mert a típus módosítása nélkül kapja meg az értéket, ellentétben a Formátum parancsmagokkal vagy a Select-Object tulajdonság értéktípusát módosító parancsmaggal.
7. példa: Modulnevek felosztása összetevőnevekre
Ebben a példában háromféleképpen oszthat fel két pontból álló modulnevet az összetevők neveire. A parancsok meghívják a sztringek felosztási metódusát. A három parancs különböző szintaxist használ, de egyenértékűek és felcserélhetők. A kimenet mindhárom esetben ugyanaz.
"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
Az első parancs a hagyományos szintaxist használja, amely egy szkriptblokkot és az aktuális objektumoperátort $_tartalmazza. A pontszintaxis használatával adja meg a metódust és zárójeleket az elválasztó argumentum beágyazásához.
A második parancs a MemberName paramétert használja a felosztási metódus és az Argumentumlista paraméter megadására a pont (.) felosztási elválasztóként való azonosításához.
A harmadik parancs a foreachForEach-Object parancsmag aliasát használja, és kihagyja a MemberName és az ArgumentList paraméterek nevét, amelyek nem kötelezőek.
8. példa: A ForEach-Object használata két szkriptblokkdal
Ebben a példában két szkriptblokkot adunk át pozícióban. Az összes szkriptblokk a Folyamat paraméterhez kapcsolódik. A művelet azonban úgy kezeli őket, mintha át lettek volna adva a Begin és a Process paramétereknek.
1..2 | ForEach-Object { 'begin' } { 'process' }
begin
process
process
9. példa: A ForEach-Object használata kétnál több szkriptblokkdal
Ebben a példában négy szkriptblokkot adunk át pozícióban. Az összes szkriptblokk a Folyamat paraméterhez kapcsolódik. A művelet azonban úgy kezeli őket, mintha át lettek volna adva a Begin, a Process és a End paraméternek.
1..2 | ForEach-Object { 'begin' } { 'process A' } { 'process B' } { 'end' }
begin
process A
process B
process A
process B
end
Megjegyzés:
Az első szkriptblokk mindig a begin blokkhoz van leképezve, az utolsó blokk a blokkhoz end van leképezve, a két középső blokk pedig a process blokkhoz van leképezve.
10. példa: Több szkriptblokk futtatása minden folyamatelemhez
Ahogy az előző példában is látható, a Folyamat paraméterrel átadott szkriptblokkok leképezhetők a Begin és a End paraméterekre. A leképezés elkerülése érdekében explicit értékeket kell megadnia a Kezdő és a Záró paraméterhez.
1..2 | ForEach-Object -Begin $null -Process { 'one' }, { 'two' }, { 'three' } -End $null
one
two
three
one
two
three
11. példa: Lassú szkript futtatása párhuzamos kötegekben
Ez a példa egy szkriptblokkot futtat, amely kiértékel egy sztringet, és egy másodpercig alszik.
$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
A ThrottleLimit paraméter értéke 4, így a bemenet négy kötegben lesz feldolgozva.
A Using: hatókör-módosító a változót minden párhuzamos szkriptblokkba továbbítja $Message .
12. példa: Naplóbejegyzések lekérése párhuzamosan
Ez a példa 50 000 naplóbejegyzést kér le 5 rendszernaplóból egy helyi Windows-gépen.
$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
A Párhuzamos paraméter az egyes bemeneti naplónevekhez párhuzamosan futó szkriptblokkot adja meg. A ThrottleLimit paraméter biztosítja, hogy mind az öt szkriptblokk egyszerre fusson.
13. példa: Párhuzamos futtatás feladatként
Ez a példa egy olyan feladatot hoz létre, amely párhuzamosan futtat egy szkriptblokkot, egyszerre kettővel.
PS> $job = 1..10 | ForEach-Object -Parallel {
"Output: $_"
Start-Sleep 1
} -ThrottleLimit 2 -AsJob
PS> $job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
23 Job23 PSTaskJob Running True PowerShell …
PS> $job.ChildJobs
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
24 Job24 PSTaskChildJob Completed True PowerShell …
25 Job25 PSTaskChildJob Completed True PowerShell …
26 Job26 PSTaskChildJob Running True PowerShell …
27 Job27 PSTaskChildJob Running True PowerShell …
28 Job28 PSTaskChildJob NotStarted False PowerShell …
29 Job29 PSTaskChildJob NotStarted False PowerShell …
30 Job30 PSTaskChildJob NotStarted False PowerShell …
31 Job31 PSTaskChildJob NotStarted False PowerShell …
32 Job32 PSTaskChildJob NotStarted False PowerShell …
33 Job33 PSTaskChildJob NotStarted False PowerShell …
A ThrottleLimit paraméter korlátozza az egyszerre futó párhuzamos szkriptblokkok számát. Az AsJob paraméter hatására a parancsmag feladatobjektumot ForEach-Object ad vissza ahelyett, hogy a kimenetet a konzolra streameli. A $job változó megkapja a kimeneti adatokat gyűjtő feladatobjektumot, és figyeli a futó állapotot. A $job.ChildJobs tulajdonság tartalmazza a párhuzamos szkriptblokkokat futtató gyermekfeladatokat.
14. példa: Szálbiztos változóhivatkozások használata
Ez a példa szkriptblokkokat hív meg párhuzamosan az egyedileg elnevezett folyamatobjektumok gyűjtéséhez.
$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
A concurrentDictionary objektum egyetlen példánya kerül minden szkriptblokkba az objektumok gyűjtéséhez. Mivel a ConcurrentDictionary szálbiztos, minden párhuzamos szkript biztonságosan módosítható. Egy nem szálbiztos objektum, például a System.Collections.Generic.Dictionary nem lenne biztonságos itt.
Megjegyzés:
Ez a példa a Párhuzamos paraméter nem hatékony használatát szemlélteti. A szkript hozzáadja a bemeneti objektumot egy egyidejű szótárobjektumhoz. Ez triviális, és nem éri meg az egyes szkriptek meghívásának többletterhelését egy külön szálon. A ForEach-Object kapcsoló nélkül történő futtatás hatékonyabb és gyorsabb. Ez a példa csak a szálbiztos változók használatát mutatja be.
15. példa: Hibák írása párhuzamos végrehajtással
Ez a példa párhuzamosan ír a hibafolyamba, ahol az írott hibák sorrendje véletlenszerű.
1..3 | ForEach-Object -Parallel {
Write-Error "Error: $_"
}
Write-Error: Error: 1
Write-Error: Error: 3
Write-Error: Error: 2
16. példa: A párhuzamos végrehajtás során felmerülő hibák megszüntetése
Ez a példa azt mutatja be, hogy egy párhuzamos szkriptblokkban végződő hiba lépett fel.
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 soha nem íródott, mert az iteráció párhuzamos szkriptblokkja leállt.
Megjegyzés:
A PipelineVariable gyakori paraméterváltozók még a hatókör-módosítóval sem támogatottak ForEach-Object -Parallel a Using: forgatókönyvekben.
17. példa: Változók átadása beágyazott párhuzamos szkriptblokkokban
Létrehozhat egy változót egy ForEach-Object -Parallel hatókörrel rendelkező szkriptblokkon kívül, és használhatja a szkriptblokkon belül a Using: hatókör-módosítóval. A PowerShell 7.2-től kezdve létrehozhat egy változót egy ForEach-Object -Parallel hatókörrel rendelkező szkriptblokkon belül, és használhatja egy beágyazott szkriptblokkban.
$test1 = 'TestA'
1..2 | ForEach-Object -Parallel {
$Using:test1
$test2 = 'TestB'
1..2 | ForEach-Object -Parallel {
$Using:test2
}
}
TestA
TestA
TestB
TestB
TestB
TestB
Megjegyzés:
A PowerShell 7.2-et megelőző verziókban a beágyazott szkriptblokk nem fér hozzá a $test2 változóhoz, és hibaüzenet jelenik meg.
18. példa: Több, szkripteket párhuzamosan futtató feladat létrehozása
A ThrottleLimit paraméter korlátozza az egyes példányok ForEach-Object -Parallelsorán futó párhuzamos szkriptek számát. Nem korlátozza az AsJob paraméter használatakor létrehozható feladatok számát. Mivel maguk a feladatok párhuzamosan futnak, több párhuzamos feladat is létrehozható, amelyek mindegyike az egyidejű szkriptblokkok megengedett korlátjához ér.
$jobs = for ($i=0; $i -lt 10; $i++) {
1..10 | ForEach-Object -Parallel {
./RunMyScript.ps1
} -AsJob -ThrottleLimit 5
}
$jobs | Receive-Job -Wait
Ez a példa 10 futó feladatot hoz létre. Minden feladat nem futtat egyszerre több 5 szkriptet. Az egyidejűleg futó példányok teljes száma 50-re korlátozódik (10 feladat az 5 ThrottleLimit értékének 10-szerese).
Paraméterek
-ArgumentList
Egy metódushívás argumentumainak tömbje. Az ArgumentListviselkedésével kapcsolatos további információkért lásd: about_Splatting.
Ezt a paramétert a Windows PowerShell 3.0-ban vezettük be.
Paramétertulajdonságok
| Típus: | Object[] |
| Alapértelmezett érték: | None |
| Támogatja a helyettesítő karaktereket: | False |
| DontShow: | False |
| Aliasok: | Argumentumok |
Paraméterkészletek
PropertyAndMethodSet
| Position: | Named |
| Kötelező: | False |
| Folyamatból származó érték: | False |
| Folyamatból származó érték tulajdonságnév alapján: | False |
| Fennmaradó argumentumokból származó érték: | False |
-AsJob
A párhuzamos meghívás PowerShell-feladatként való futtatását okozza. A rendszer egyetlen feladatobjektumot ad vissza a futó szkriptblokkok kimenete helyett. A feladatobjektum gyermekfeladatokat tartalmaz minden futtatott párhuzamos szkriptblokkhoz. A feladatobjektumot bármelyik PowerShell-feladatparancsmaggal használhatja a futó állapot megtekintéséhez és az adatok lekéréséhez.
Ezt a paramétert a PowerShell 7.0-ban vezettük be.
Paramétertulajdonságok
| Típus: | SwitchParameter |
| Alapértelmezett érték: | None |
| Támogatja a helyettesítő karaktereket: | False |
| DontShow: | False |
Paraméterkészletek
ParallelParameterSet
| Position: | Named |
| Kötelező: | False |
| Folyamatból származó érték: | False |
| Folyamatból származó érték tulajdonságnév alapján: | False |
| Fennmaradó argumentumokból származó érték: | False |
-Begin
Olyan szkriptblokkot ad meg, amely azelőtt fut, hogy ez a parancsmag feldolgozza a bemeneti objektumokat. Ez a szkriptblokk csak egyszer fut a teljes folyamathoz. További információ a begin blokkról: about_Functions.
Paramétertulajdonságok
| Típus: | ScriptBlock |
| Alapértelmezett érték: | None |
| Támogatja a helyettesítő karaktereket: | False |
| DontShow: | False |
Paraméterkészletek
ScriptBlockSet
| Position: | Named |
| Kötelező: | False |
| Folyamatból származó érték: | False |
| Folyamatból származó érték tulajdonságnév alapján: | False |
| Fennmaradó argumentumokból származó érték: | False |
-Confirm
Megerősítést kér a parancsmag futtatása előtt.
Paramétertulajdonságok
| Típus: | SwitchParameter |
| Alapértelmezett érték: | False |
| Támogatja a helyettesítő karaktereket: | False |
| DontShow: | False |
| Aliasok: | Cf |
Paraméterkészletek
(All)
| Position: | Named |
| Kötelező: | False |
| Folyamatból származó érték: | False |
| Folyamatból származó érték tulajdonságnév alapján: | False |
| Fennmaradó argumentumokból származó érték: | False |
-End
Egy szkriptblokkot ad meg, amely azután fut, hogy ez a parancsmag feldolgozza az összes bemeneti objektumot. Ez a szkriptblokk csak egyszer fut a teljes folyamathoz. További információ a end blokkról: about_Functions.
Paramétertulajdonságok
| Típus: | ScriptBlock |
| Alapértelmezett érték: | None |
| Támogatja a helyettesítő karaktereket: | False |
| DontShow: | False |
Paraméterkészletek
ScriptBlockSet
| Position: | Named |
| Kötelező: | False |
| Folyamatból származó érték: | False |
| Folyamatból származó érték tulajdonságnév alapján: | False |
| Fennmaradó argumentumokból származó érték: | False |
-InputObject
Megadja a bemeneti objektumokat.
ForEach-Object Minden bemeneti objektumon futtatja a szkriptblokkot vagy a műveleti utasítást. Adjon meg egy változót, amely tartalmazza az objektumokat, vagy írjon be egy parancsot vagy kifejezést, amely lekéri az objektumokat.
Ha az InputObject paramétert ForEach-Objecthasználja a piping parancs eredményei ForEach-Objecthelyett, a rendszer egyetlen objektumként kezeli az InputObject értéket. Ez akkor is igaz, ha az érték olyan gyűjtemény, amely egy parancs, például -InputObject (Get-Process)eredménye.
Mivel az InputObject nem tud egyedi tulajdonságokat visszaadni egy tömbből vagy objektumgyűjteményből, javasoljuk, hogy ha olyan objektumok gyűjteményén hajt ForEach-Object végre műveleteket, amelyek meghatározott tulajdonságokban meghatározott értékekkel rendelkeznek, akkor ForEach-Object használja a folyamatban a jelen témakör példáiban látható módon.
Paramétertulajdonságok
| Típus: | PSObject |
| Alapértelmezett érték: | None |
| Támogatja a helyettesítő karaktereket: | False |
| DontShow: | False |
Paraméterkészletek
(All)
| Position: | Named |
| Kötelező: | False |
| Folyamatból származó érték: | True |
| Folyamatból származó érték tulajdonságnév alapján: | False |
| Fennmaradó argumentumokból származó érték: | False |
-MemberName
Megadja a lekérni kívánt tagtulajdonság nevét vagy a meghívni kívánt tagmetódus nevét. A tagoknak példánytagnak kell lenniük, nem statikus tagoknak.
A helyettesítő karakterek használata engedélyezett, de csak akkor működik, ha az eredményül kapott sztring egyedi értékre van feloldva.
Ha például futtatja Get-Process | foreach -MemberName *Name, a helyettesítő karakterminta egynél több tagra egyezik, ami miatt a parancs meghiúsul.
Ezt a paramétert a Windows PowerShell 3.0-ban vezettük be.
Paramétertulajdonságok
| Típus: | String |
| Alapértelmezett érték: | None |
| Támogatja a helyettesítő karaktereket: | True |
| DontShow: | False |
Paraméterkészletek
PropertyAndMethodSet
| Position: | 0 |
| Kötelező: | True |
| Folyamatból származó érték: | False |
| Folyamatból származó érték tulajdonságnév alapján: | False |
| Fennmaradó argumentumokból származó érték: | False |
-Parallel
Megadja a bemeneti objektumok párhuzamos feldolgozásához használandó szkriptblokkot. Adjon meg egy szkriptblokkot, amely leírja a műveletet.
Ezt a paramétert a PowerShell 7.0-ban vezettük be.
Paramétertulajdonságok
| Típus: | ScriptBlock |
| Alapértelmezett érték: | None |
| Támogatja a helyettesítő karaktereket: | False |
| DontShow: | False |
Paraméterkészletek
ParallelParameterSet
| Position: | Named |
| Kötelező: | True |
| Folyamatból származó érték: | False |
| Folyamatból származó érték tulajdonságnév alapján: | False |
| Fennmaradó argumentumokból származó érték: | False |
-Process
Meghatározza az egyes bemeneti objektumokon végrehajtott műveletet. Ez a szkriptblokk a folyamat minden objektumához fut. További információ a process blokkról: about_Functions.
Ha több szkriptblokkot ad meg a Folyamat paraméternek, az első szkriptblokk mindig a begin blokkhoz lesz leképezve. Ha csak két szkriptblokk van, a második blokk a blokkhoz process van leképezve. Ha három vagy több szkriptblokk van, az első szkriptblokk mindig a begin blokkra van leképezve, az utolsó blokk a blokkra end van leképezve, a középső blokkok pedig a process blokkra vannak leképezve.
Paramétertulajdonságok
| Típus: | |
| Alapértelmezett érték: | None |
| Támogatja a helyettesítő karaktereket: | False |
| DontShow: | False |
Paraméterkészletek
ScriptBlockSet
| Position: | 0 |
| Kötelező: | True |
| Folyamatból származó érték: | False |
| Folyamatból származó érték tulajdonságnév alapján: | False |
| Fennmaradó argumentumokból származó érték: | False |
-RemainingScripts
Megadja az összes olyan szkriptblokkot, amelyet a Folyamat paraméter nem vesz fel.
Ezt a paramétert a Windows PowerShell 3.0-ban vezettük be.
Paramétertulajdonságok
| Típus: | |
| Alapértelmezett érték: | None |
| Támogatja a helyettesítő karaktereket: | False |
| DontShow: | False |
Paraméterkészletek
ScriptBlockSet
| Position: | Named |
| Kötelező: | False |
| Folyamatból származó érték: | False |
| Folyamatból származó érték tulajdonságnév alapján: | False |
| Fennmaradó argumentumokból származó érték: | False |
-ThrottleLimit
A párhuzamosan futó szkriptblokkok számát adja meg. A bemeneti objektumok mindaddig le lesznek tiltva, amíg a futó szkriptblokkok száma a ThrottleLimit alá nem csökken. Az alapértelmezett érték a 5.
A ThrottleLimit paraméter korlátozza az egyes példányok ForEach-Object -Parallelsorán futó párhuzamos szkriptek számát. Nem korlátozza az AsJob paraméter használatakor létrehozható feladatok számát. Mivel maguk a feladatok párhuzamosan futnak, több párhuzamos feladat is létrehozható, amelyek mindegyike az egyidejű szkriptblokkok megengedett korlátjához ér.
Ezt a paramétert a PowerShell 7.0-ban vezettük be.
Paramétertulajdonságok
| Típus: | Int32 |
| Alapértelmezett érték: | 5 |
| Támogatja a helyettesítő karaktereket: | False |
| DontShow: | False |
Paraméterkészletek
ParallelParameterSet
| Position: | Named |
| Kötelező: | False |
| Folyamatból származó érték: | False |
| Folyamatból származó érték tulajdonságnév alapján: | False |
| Fennmaradó argumentumokból származó érték: | False |
-TimeoutSeconds
Megadja, hogy hány másodpercig kell várni az összes bemenet párhuzamos feldolgozására. A megadott időtúllépési idő után az összes futó szkript le lesz állítva. A többi feldolgozandó bemeneti objektumot pedig figyelmen kívül hagyja a rendszer. Az alapértelmezett érték 0 letiltja az időtúllépést, és ForEach-Object -Parallel határozatlan ideig futtatható. A Ctrl+C parancssorba való beírása leállítja a futó ForEach-Object -Parallel parancsokat. Ez a paraméter nem használható az AsJob paraméterrel együtt.
Ezt a paramétert a PowerShell 7.0-ban vezettük be.
Paramétertulajdonságok
| Típus: | Int32 |
| Alapértelmezett érték: | 0 |
| Támogatja a helyettesítő karaktereket: | False |
| DontShow: | False |
Paraméterkészletek
ParallelParameterSet
| Position: | Named |
| Kötelező: | False |
| Folyamatból származó érték: | False |
| Folyamatból származó érték tulajdonságnév alapján: | False |
| Fennmaradó argumentumokból származó érték: | False |
-UseNewRunspace
A párhuzamos meghívás minden ciklus iterációjához létrehoz egy új futtatóteret ahelyett, hogy újrahasználja a runspace-készletből származó runspace-eket.
Ez a paraméter a PowerShell 7.1-ben lett bevezetve
Paramétertulajdonságok
| Típus: | SwitchParameter |
| Alapértelmezett érték: | False |
| Támogatja a helyettesítő karaktereket: | False |
| DontShow: | False |
Paraméterkészletek
ParallelParameterSet
| Position: | Named |
| Kötelező: | False |
| Folyamatból származó érték: | False |
| Folyamatból származó érték tulajdonságnév alapján: | False |
| Fennmaradó argumentumokból származó érték: | False |
-WhatIf
Megjeleníti, mi történne, ha a parancsmag futna. A parancsprogram nem lett futtatva.
Paramétertulajdonságok
| Típus: | SwitchParameter |
| Alapértelmezett érték: | False |
| Támogatja a helyettesítő karaktereket: | False |
| DontShow: | False |
| Aliasok: | Wi |
Paraméterkészletek
(All)
| Position: | Named |
| Kötelező: | False |
| Folyamatból származó érték: | False |
| Folyamatból származó érték tulajdonságnév alapján: | False |
| Fennmaradó argumentumokból származó érték: | False |
CommonParameters
Ez a parancsmag a következő gyakori paramétereket támogatja: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction és -WarningVariable. További információért lásd about_CommonParameters.
Bevitelek
PSObject
A parancsmaghoz bármilyen objektumot csövezhet.
Kimenetek
PSObject
Ez a parancsmag a bemenet által meghatározott objektumokat adja vissza.
Jegyzetek
A PowerShell a következő aliasokat tartalmazza ForEach-Object:
- Minden platform:
%foreach
A ForEach-Object parancsmag az utasításhoz hasonlóan foreach működik, azzal a kivétellel, hogy nem tud bemenő csövet adni egy foreach utasításhoz. Az utasítással kapcsolatos további információkért lásd: foreachabout_Foreach.
A PowerShell 4.0-tól WhereForEach kezdve a gyűjteményekhez használható metódusok lettek hozzáadva. Ezekről az új módszerekről itt olvashat bővebben about_Arrays
ForEach-Object -Parallel használata:
ForEach-Object -Parallelaz egyes szkriptblokkokat egy új futtatótérben futtatja. Az új futtatóterek jelentősen nagyobb többletterhelést okoznak, mint a szekvenciális feldolgozással való futtatásForEach-Object. Fontos a Párhuzamos használata, ahol a párhuzamos futtatás többletterhelése kicsi a szkriptblokk által végzett munkához képest. Például:- Számítási igényű szkriptek többmagos gépeken
- Az eredményekre való várakozást vagy fájlműveleteket végző szkriptek
A Párhuzamos paraméter használata esetén a szkriptek a szokásosnál sokkal lassabban futnak. Különösen akkor, ha a párhuzamos szkriptek triviálisak. Kísérletezzen a Parallelnel , hogy kiderítse, hol lehet hasznos.
Ha párhuzamosan fut, a ScriptProperties vagy a ScriptMethods által dekorált objektumok nem garantálhatók a helyes működésre, ha más futtató térben futnak, mint a szkriptek eredetileg hozzájuk voltak csatolva.
A szkriptblokk meghívása mindig a saját futtatókörnyezetében próbál futni, függetlenül attól, hogy hol hívja meg a rendszer. Azonban ideiglenes runspace-eket hoz létre,
ForEach-Object -Parallelamelyek használat után törlődnek, így a szkriptek már nem futtathatók.Ez a viselkedés mindaddig működik, amíg az otthoni futtatótér még létezik. Előfordulhat azonban, hogy nem kapja meg a kívánt eredményt, ha a szkript olyan külső változóktól függ, amelyek csak a hívó futtatóterében találhatók, és nem a kezdő futtatótérben.
A nem végződő hibák a parancsmag hibastreambe lesznek írva, miközben párhuzamosan futó szkriptblokkokban fordulnak elő. Mivel a párhuzamos szkriptblokk végrehajtási sorrendje nem determinisztikus, a hibák a hibastreamben való megjelenésének sorrendje véletlenszerű. Hasonlóképpen, a más adatfolyamokra, például figyelmeztetésre, részletesre vagy információkra írt üzeneteket a rendszer határozatlan sorrendben írja az adatfolyamokra.
A hibák( például kivételek) megszüntetése leállítja azoknak a szkriptblokkoknak az egyéni párhuzamos példányát, amelyekben ezek előfordulnak. Előfordulhat, hogy egy szkriptblokkban megszűnő hiba nem okozza a
ForEach-Objectparancsmag leállítását. A többi, párhuzamosan futó szkriptblokk továbbra is fut, kivéve, ha végződési hibába ütköznek. A megszüntető hiba a hibaadat-adatfolyamba lesz beírva errorRecord for a FullyQualifiedErrorId ofPSTaskException. A megszüntetési hibák PowerShell-leltry/catchvagytrapblokkokkal nem végződő hibákká alakíthatók.A PipelineVariable gyakori paraméterváltozók párhuzamos forgatókönyvekben még a
Using:hatókör-módosítóval sem támogatottak.Fontos
A
ForEach-Object -Parallelparaméterkészlet szkriptblokkokat futtat párhuzamosan külön folyamatszálakon. AUsing:módosító lehetővé teszi változóhivatkozások átadását a parancsmag meghívási száláról minden futó szkriptblokk-szálra. Mivel a szkriptblokkok különböző szálakban futnak, a hivatkozás által átadott objektumváltozókat biztonságosan kell használni. Általában biztonságos az olyan hivatkozott objektumokból olvasni, amelyek nem változnak. Ha módosítania kell az objektum állapotát, akkor szálbiztos objektumokat kell használnia, például .NET System.Collection.Concurrent típusokat (lásd a 14. példát).