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

Description

A ForEach-Object parancsmag műveletet hajt végre a bemeneti objektumok gyűjteményének minden elemén. 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étféleképpen hozhat létre ForEach-Object parancsot.

  • 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}

  • 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

    A szkriptblokk formátum használatakor az egyes bemeneti objektumokon végrehajtott műveleteket leíró szkriptblokk használata mellett két további szkriptblokkot is megadhat. A Begin szkriptblokk, amely a Begin paraméter értéke, még azelőtt fut, hogy ez a parancsmag feldolgozza az első bemeneti objektumot. A végszkriptblokk, amely a End paraméter értéke, a parancsmag az utolsó bemeneti objektumot dolgozza fel.

Példák

1. példa: Egész számok osztása tömbben

30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625

Ez a parancs három egész számból álló tömböt vesz fel, és mindegyiket 1024-sel osztja el.

2. példa: A könyvtárban lévő összes fájl hosszának lekérése

Get-ChildItem $pshome | ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}

Ez a parancs lekéri a fájlokat és könyvtárakat a PowerShell telepítési könyvtárában $pshome, és átadja őket a ForEach-Object parancsmagnak. 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

$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}

Ez a parancs lekéri az 1000 legutóbbi eseményt a Rendszer eseménynaplójából, és tárolja őket a $Events változóban. Ezután az eseményeket a ForEach-Object parancsmagba csövezi.

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

Get-ItemProperty -Path HKCU:\Network\* | ForEach-Object {Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper();}

Ez a parancs a RemotePath beállításjegyzék-bejegyzés értékét a HKCU:\Hálózati kulcs alatti összes alkulcsban nagybetűs szövegre módosítja. 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 az E: meghajtót a \\Server\Share fájlra, a HKCU:\Network E alkulcsa jelenik meg, és az E alkulcsban található RemotePath beállításjegyzék-bejegyzés értéke \\Server\Share lesz.

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

1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello

Ez a példa azt mutatja be, hogy milyen hatással van az $Null automatikus változó a ForEach-Object parancsmagra.

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.

Az $Null automatikus változóval kapcsolatos további információkért lásd: about_Automatic_Variables.

6. példa: Tulajdonságértékek lekérése

Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path

Ezek a parancsok az összes telepített PowerShell-modul Path tulajdonságának értékét kapják meg. A MemberName paramétert használják a modulok Elérési út tulajdonságának megadásához.

A második parancs egyenértékű az első paranccsal. A parancsmag ForEach-Object aliasát használja, és kihagyja a MemberName paraméter nevét, ami nem kötelező.

A ForEach-Object parancsmag nagyon hasznos tulajdonságértékek lekéréséhez, mivel a típus módosítása nélkül kapja meg az értéket, ellentétben a Formátum parancsmagokkal vagy a tulajdonságérték típusát módosító Select-Object parancsmaggal.

7. példa: Modulnevek felosztása összetevőnevekre

"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

Ezek a parancsok két pontokkal tagolt modulnevet osztanak fel 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.

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éter használatával adja meg a Felosztás metódust, a ArgumentName paramétert pedig a pont (".") felosztási elválasztóként való azonosításához.

A harmadik parancs a Foreach-Object parancsmag Foreach aliasát használja, és kihagyja a MemberName és ArgumentList paraméterek nevét, amelyek nem kötelezőek.

Az alábbi három parancs kimenete azonos.

split csak egy a számos hasznos sztringmetszet közül. A sztringek összes tulajdonságának és metódusának megtekintéséhez sztringet csövezhet a Get-Member parancsmagba.

Paraméterek

-ArgumentList

Egy metódushívás argumentumainak tömbje.

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

-Begin

Olyan szkriptblokkot ad meg, amely azelőtt fut, hogy ez a parancsmag feldolgozza a bemeneti objektumokat.

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.

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 Get-Process | ForEach -MemberName *Namefuttat, és egynél több tag rendelkezik a Név sztringet tartalmazó névvel, például a ProcessName és Név tulajdonsággal, 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

-Process

Meghatározza az egyes bemeneti objektumokon végrehajtott műveletet. Adjon meg egy szkriptblokkot, amely leírja a műveletet.

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

-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