Megosztás a következőn keresztül:


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-Object támogatja a begin, processés end blokkokat 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 ProcessName

  • 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. 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:

ScriptBlock[]

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:

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

-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 -Parallel paramé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-Object Fontos 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 -Parallel amelyek 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-Object parancsmag 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 of PSTaskException. 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 -Parallel paramé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).