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 <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-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é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-Object A 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 ProcessName

    Az 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:

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

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

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 -Parallel az 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ás ForEach-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 -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 megszüntetési hibák PowerShell-lel try/catchvagy trap blokkokkal 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 -Parallel paraméterkészlet szkriptblokkokat futtat párhuzamosan külön folyamatszálakon. A Using: 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).