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 <Int32>]
[-TimeoutSeconds <Int32>]
[-AsJob]
[-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. 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érnek az adott hatókörben lévő változókhoz, és új változókat hozhatnak létre, amelyek a parancsmag befejezése után is megmaradnak az adott hatókörben.
műveleti utasítás. Egy műveleti utasítást is írhat, amely sokkal inkább hasonlít a természetes nyelvhez. A műveleti utasítással megadhat egy tulajdonságértéket, vagy meghívhat egy metódust. A műveleti utasítások a Windows PowerShell 3.0-ban lettek bevezetve.
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 ProcessNamePá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. A$using:kulcsszó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 runspace-készlet méretét a ThrottleLimit paraméter határozza meg. 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-zel 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.
$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 Lekéri az 1000 legutóbbi eseményt a rendszer eseménynaplójából, és tárolja őket a változóban $Events .
$Events ezután a ForEach-Object parancsmagba kerül. A Begin paraméter megjeleníti az aktuális dátumot és időpontot. Ezután a Process paraméter a Out-File parancsmaggal hoz létre egy events.txt nevű szövegfájlt, és az egyes események üzenettulajdonságait tárolja a fájlban. Végül a End paraméter a feldolgozás befejezését követő dátum és idő megjelenítésére szolgál.
4. példa: Beállításkulcs értékének módosítása
Ez a példa a kulcs alatti összes alkulcs HKCU:\Network beállításjegyzék-bejegyzésének értékét nagybetűsre 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 az E: meghajtót a következőre \\Server\Shareképezi le, akkor egy E alkulcs jön létre HKCU:\Network , amelynek RemotePath beállításazonosítója \\Server\Share.
A parancs a Get-ItemProperty parancsmaggal lekéri a Hálózati kulcs összes alkulcsát, valamint a Set-ItemProperty parancsmagot a RemotePath beállításjegyzék-bejegyzés értékének módosításához az egyes kulcsokban.
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 a null értéket, a ForEach-Object parancsmag értéket hoz létre a $Nullszámára, ugyanúgy, mint más, hozzá csövezendő objektumok esetében.
6. példa: Tulajdonságértékek lekérése
Ez a példa az összes telepített PowerShell-modul Path tulajdonságának értékét a parancsmag ForEach-Object paraméterével kapja meg.
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 parancsmag ForEach-Object aliasát használja, és kihagyja a MemberName és 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 rendszer azonban úgy kezeli őket, mintha átadták volna őket 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 két szkriptblokkot adunk át pozícióban. Az összes szkriptblokk a Folyamat paraméterhez kapcsolódik. A rendszer azonban úgy kezeli őket, mintha átadták volna őket a Begin, a Process és a End paramétereknek.
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 hozzárendelve, az utolsó blokk a end blokkhoz, és a köztes blokkok mind a process blokkhoz vannak 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 egyszerű szkriptblokkot futtat, amely kiértékel egy sztringet, és egy másodpercig alvó állapotban van.
$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: kulcsszó a változó átadására szolgál az $Message egyes párhuzamos szkriptblokkokba.
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 egyszerű szkriptblokkot futtat párhuzamosan, és egyszerre két háttérfeladatot hoz létre.
$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
A $job változó megkapja a kimeneti adatokat gyűjtő és a futó állapotot figyelő feladatobjektumot.
A feladatobjektum a Várakozás kapcsoló paraméterrel van átirányítvaReceive-Job. Ez pedig a kimenetet a konzolra továbbítja, mintha ForEach-Object -ParallelAsJob nélkül futna.
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, biztonságosan módosítható minden párhuzamos szkript. 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 Parallel paraméter nagyon nem hatékony használata. A szkript egyszerűen hozzáadja a bemeneti objektumot egy egyidejű szótárobjektumhoz. Triviális, és nem éri meg az egyes szkriptek külön szálban való megidézését. A párhuzamos kapcsoló nélküli normál működés ForEach-Object sokkal 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:
PipelineVariable gyakori paraméterváltozók még a $using: kulcsszóval sem támogatottakForeach-Object -Parallel.
17. példa: Változók átadása beágyazott párhuzamos szkriptben ScriptBlockSet
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 kulcsszóval.$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.
A beágyazott szkriptblokk nem fér hozzá a változóhoz $test2 , és a rendszer hibát jelez.
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 az összes PowerShell-feladat parancsmagja használhatja a futó állapot figyelésére és az adatok lekérésére.
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 egy parancs eredménye, például -InputObject (Get-Process).
Mivel InputObject nem tud egyedi tulajdonságokat visszaadni egy tömbből vagy objektumgyűjteményből, javasoljuk, hogy ha a ForEach-Object használatával hajt végre műveleteket azon objektumok gyűjteményén, amelyek meghatározott értékekkel rendelkeznek a meghatározott tulajdonságokban, akkor a folyamat ForEach-Object használjon, ahogyan az a jelen témakör példáiban is látható.
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érendő tulajdonságot vagy a meghívni kívánt metódust.
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 blokkhoz, az utolsó blokk a end blokkhoz, a köztes blokkok pedig mind a process blokkhoz 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 azokat a szkriptblokkokat, amelyeket nem a Process paraméter hozott létre.
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
Megadja a párhuzamosan lévő szkriptblokkok számát. 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.
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 parancsmag nem fut.
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 ForEach-Object parancsmag hasonlóan működik, mint a Foreach utasítás, azzal a kivétellel, hogy a Foreach utasításhoz nem lehet bemenő adatokat becsúszni. Az Foreach utasítással kapcsolatos további információkért lásd: about_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:
A
ForEach-Object -Parallelparaméterkészlet a PowerShell belső API-ját használja az egyes szkriptblokkok új futtatótérben való futtatásához. Ez lényegesen többletterhelést jelent, mint a szekvenciális feldolgozással való normál futtatás.ForEach-ObjectFontos a párhuzamos használat, ha a párhuzamos futtatás többletterhelése kicsi a szkriptblokk által végrehajtott 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.
Párhuzamos futtatás esetén a ScriptProperties vagy ScriptMethods objektumokkal díszített objektumok megfelelő működése nem garantálható, ha a szkriptek eredetileg csatolt fájljaitól eltérő futási térben futnak.
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 megszakítási hibák nem megszakító hibákká alakíthatók a PowerShell try/catch vagy trap blokkok használatával.PipelineVariable gyakori paraméterváltozók párhuzamos forgatókönyvekben még a
$using:kulcsszóval sem támogatottak.Fontos
A
ForEach-Object -Parallelparaméterkészlet szkriptblokkokat futtat párhuzamosan külön folyamatszálakon. A$using:kulcsszó lehetővé teszi a változóhivatkozások átadását a parancsmag meghívási szálából az egyes futó szkriptblokk-szálakba. 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ágosan olvasható a nem változó hivatkozott objektumokból. Ha azonban az objektum állapota módosul, akkor szálbiztos objektumokat kell használnia, például a .NET System.Collection.Concurrent típusokat (lásd a 11. példát).