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 ProcessNameA 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-Objectparancsmag 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
WhereForEachkezdve a gyűjteményekhez használható metódusok lettek hozzáadva. - Ezekről az új módszerekről itt olvashat bővebben about_arrays