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-Object
támogatja abegin
,process
ésend
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 $PSHOME
lé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-Object
használja a piping parancs eredményei ForEach-Object
helyett, 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
A parancsmaghoz bármilyen objektumot csövezhet.
Kimenetek
Ez a parancsmag a bemenet által meghatározott objektumokat adja vissza.
Jegyzetek
A Windows PowerShell a következő aliasokat ForEach-Object
tartalmazza:
%
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