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

ForEach-Object
            [-InputObject <PSObject>]
            [-Begin <ScriptBlock>]
            [-Process] <ScriptBlock[]>
            [-End <ScriptBlock>]
            [-RemainingScripts <ScriptBlock[]>]
            [-WhatIf]
            [-Confirm]
            [<CommonParameters>]
ForEach-Object
            [-InputObject <PSObject>]
            [-MemberName] <String>
            [-ArgumentList <Object[]>]
            [-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 parancsokat ForEach-Object .

  • 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 a begin, processés end blokkokat az about_functions.

    Feljegyzé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.

  • 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é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-keretrendszer 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-Object használjaForeach, é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 aliasát ForEach-Object használja, és kihagyja a MemberName és az ArgumentList paraméterek nevét, amelyek nem kötelezőek.

8. példa: 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

Feljegyzé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

Paraméterek

-ArgumentList

Egy metódushívás argumentumainak tömbje. Az Argumentumlista működé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.

Típus:Object[]
Aliasok:Args
Position:Named
Alapértelmezett érték:None
Kötelező:False
Folyamatbemenet elfogadása:False
Helyettesítő karakterek elfogadása: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.

Típus:ScriptBlock
Position:Named
Alapértelmezett érték:None
Kötelező:False
Folyamatbemenet elfogadása:False
Helyettesítő karakterek elfogadása:False

-Confirm

Jóváhagyást kér a parancsmag futtatása előtt.

Típus:SwitchParameter
Aliasok:cf
Position:Named
Alapértelmezett érték:False
Kötelező:False
Folyamatbemenet elfogadása:False
Helyettesítő karakterek elfogadása: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.

Típus:ScriptBlock
Position:Named
Alapértelmezett érték:None
Kötelező:False
Folyamatbemenet elfogadása:False
Helyettesítő karakterek elfogadása: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 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.

Típus:PSObject
Position:Named
Alapértelmezett érték:None
Kötelező:False
Folyamatbemenet elfogadása:True
Helyettesítő karakterek elfogadása: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.

Típus:String
Position:0
Alapértelmezett érték:None
Kötelező:True
Folyamatbemenet elfogadása:False
Helyettesítő karakterek elfogadása:True

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

Típus:ScriptBlock[]
Position:0
Alapértelmezett érték:None
Kötelező:True
Folyamatbemenet elfogadása:False
Helyettesítő karakterek elfogadása: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.

Típus:ScriptBlock[]
Position:Named
Alapértelmezett érték:None
Kötelező:False
Folyamatbemenet elfogadása:False
Helyettesítő karakterek elfogadása:False

-WhatIf

Bemutatja, mi történne a parancsmag futtatásakor. A parancsmag nem fut.

Típus:SwitchParameter
Aliasok:wi
Position:Named
Alapértelmezett érték:False
Kötelező:False
Folyamatbemenet elfogadása:False
Helyettesítő karakterek elfogadása:False

Bevitelek

PSObject

A parancsmaghoz bármilyen objektumot csövezhet.

Kimenetek

PSObject

Ez a parancsmag a bemenet által meghatározott objektumokat adja vissza.

Jegyzetek

A Windows PowerShell a következő aliasokat ForEach-Objecttartalmazza:

  • %
  • foreach

A ForEach-Object parancsmag a Foreach utasításhoz hasonlóan működik, azzal a kivétellel, hogy a Foreach-utasításba nem lehet bemenő adatokat becsúszni. A Foreach-utasítással kapcsolatos további információkért lásd: about_Foreach.

A PowerShell 4.0-tól Where ForEach 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