ForEach-Object
Provede operaci s každou položkou v kolekci vstupních objektů.
Syntaxe
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
Rutina ForEach-Object provádí operaci pro každou položku v kolekci vstupních objektů. Vstupní objekty lze předvést do rutiny nebo zadat pomocí parametru InputObject.
Počínaje windows PowerShellem 3.0 existují dva různé způsoby vytvoření příkazu ForEach-Object.
blok skriptu. K určení operace můžete použít blok skriptu. V bloku skriptu použijte proměnnou
$_
k reprezentaci aktuálního objektu. Blok skriptu je hodnota parametru Process. Blok skriptu může obsahovat libovolný skript PowerShellu.Například následující příkaz získá hodnotu ProcessName vlastnost každého procesu v počítači.
Get-Process | ForEach-Object {$_.ProcessName}
příkaz Operation. Můžete také napsat příkaz operace, což je mnohem více jako přirozený jazyk. Příkaz operace můžete použít k určení hodnoty vlastnosti nebo volání metody. Příkazy operací byly zavedeny ve Windows PowerShellu 3.0.
Například následující příkaz získá také hodnotu ProcessName vlastnost každého procesu v počítači.
Get-Process | ForEach-Object ProcessName
Při použití formátu bloku skriptu můžete kromě bloku skriptu, který popisuje operace prováděné u každého vstupního objektu, poskytnout dva další bloky skriptu. Blok skriptu Begin, což je hodnota parametru Begin, se spustí před tím, než tato rutina zpracuje první vstupní objekt. Blok koncového skriptu, což je hodnota parametru End, se spustí po zpracování posledního vstupního objektu.
Příklady
Příklad 1: Dělení celých čísel v matici
30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625
Tento příkaz vezme pole tří celých čísel a vydělí každou z nich číslem 1024.
Příklad 2: Získání délky všech souborů v adresáři
Get-ChildItem $pshome | ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}
Tento příkaz získá soubory a adresáře v instalačním adresáři PowerShellu $pshome
a předá je do rutiny ForEach-Object
.
Pokud objekt není adresář, blok skriptu získá název souboru, vydělí hodnotu jeho Length vlastnost 1024 a přidá mezeru (" ") k oddělení od další položky.
Rutina používá vlastnost PSISContainer k určení, zda je objekt adresářem.
Příklad 3: Operace s nejnovějšími událostmi systému
$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}
Tento příkaz získá 1000 nejnovějších událostí z protokolu událostí systému a uloží je do proměnné $Events
.
Potom události předá rutině ForEach-Object
.
Parametr Begin zobrazuje aktuální datum a čas.
Dále parametr Process použije rutinu Out-File
k vytvoření textového souboru s názvem events.txt a uloží vlastnost zprávy všech událostí v daném souboru.
Nakonec se k zobrazení data a času po dokončení veškerého zpracování použije parametr End.
Příklad 4: Změna hodnoty klíče registru
Get-ItemProperty -Path HKCU:\Network\* | ForEach-Object {Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper();}
Tento příkaz změní hodnotu položky registru RemotePath ve všech podklíčích podklíčů podklíčů HKCU:\Síťový klíč na velká písmena textu. Tento formát můžete použít ke změně formuláře nebo obsahu hodnoty položky registru.
Každý podklíč v klíči Network představuje mapovanou síťovou jednotku, která se znovu připojí při přihlášení. Položka RemotePath obsahuje cestu UNC připojené jednotky. Pokud například namapujete jednotku E: na \\Server\Share, bude podklíč E HKCU:\Network a hodnota položky registru RemotePath v podklíči E bude \\Server\Share.
Příkaz používá rutinu Get-ItemProperty
k získání všech podklíčů klíče Network a rutiny Set-ItemProperty
ke změně hodnoty položky registru RemotePath v každém klíči.
V příkazu Set-ItemProperty
je cesta hodnotou vlastnosti PSPath klíče registru.
Toto je vlastnost objektu rozhraní Microsoft .NET Framework, který představuje klíč registru, nikoli položku registru.
Příkaz používá metodu
Vzhledem k tomu, že Set-ItemProperty
mění vlastnost každého klíče, je pro přístup k této vlastnosti nutná rutina ForEach-Object
.
Příklad 5: Použití $Null automatické proměnné
1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello
Tento příklad ukazuje účinek propojení $Null
automatické proměnné do rutiny ForEach-Object
.
Vzhledem k tomu, že PowerShell považuje hodnotu null za explicitní zástupný symbol, ForEach-Object
rutina vygeneruje hodnotu pro $Null
, stejně jako u jiných objektů, které do ní předáte.
Další informace o $Null
automatické proměnné najdete v tématu about_Automatic_Variables.
Příklad 6: Získání hodnot vlastností
Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path
Tyto příkazy získá hodnotu vlastnosti Path všech nainstalovaných modulů PowerShellu. Pomocí parametru MemberName určí vlastnost Path modulů.
Druhý příkaz je ekvivalentní prvnímu příkazu.
Používá alias Foreach rutiny ForEach-Object
a vynechá název parametru MemberName, který je volitelný.
Rutina
Příklad 7: Rozdělení názvů modulů na názvy komponent
"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
Tyto příkazy rozdělují dva názvy modulů oddělených tečkami na názvy komponent. Příkazy volají metodu Split řetězců. Tyto tři příkazy používají jinou syntaxi, ale jsou ekvivalentní a zaměnitelné.
První příkaz používá tradiční syntaxi, která zahrnuje blok skriptu a aktuální operátor objektu $_
.
Pomocí syntaxe tečky určuje metodu a závorky k uzavření argumentu oddělovače.
Druhý příkaz pomocí parametru MemberName určuje metodu Split a parametr ArgumentName k identifikaci tečky (".") jako oddělovače rozdělení.
Třetí příkaz používá alias
Výstup těchto tří příkazů, jak je znázorněno níže, je shodný.
Split je jen jednou z mnoha užitečných metod řetězců.
Pokud chcete zobrazit všechny vlastnosti a metody řetězců, předáte řetězec do rutiny Get-Member
.
Parametry
-ArgumentList
Určuje pole argumentů pro volání metody.
Tento parametr byl představen ve Windows PowerShellu 3.0.
Typ: | Object[] |
Aliasy: | Args |
Position: | Named |
Default value: | None |
Vyžadováno: | False |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | False |
-Begin
Určuje blok skriptu, který se spustí před tím, než tato rutina zpracuje všechny vstupní objekty.
Typ: | ScriptBlock |
Position: | Named |
Default value: | None |
Vyžadováno: | False |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | False |
-Confirm
Před spuštěním rutiny vás vyzve k potvrzení.
Typ: | SwitchParameter |
Aliasy: | cf |
Position: | Named |
Default value: | False |
Vyžadováno: | False |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | False |
-End
Určuje blok skriptu, který se spustí po této rutině, zpracuje všechny vstupní objekty.
Typ: | ScriptBlock |
Position: | Named |
Default value: | None |
Vyžadováno: | False |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | False |
-InputObject
Určuje vstupní objekty.
ForEach-Object
spustí blok skriptu nebo příkaz operace na každém vstupním objektu.
Zadejte proměnnou, která obsahuje objekty, nebo zadejte příkaz nebo výraz, který objekty získá.
Pokud použijete InputObject parametr s ForEach-Object
, místo piping command results to ForEach-Object
, InputObject hodnota je považována za jeden objekt.
To platí i v případě, že hodnota je kolekce, která je výsledkem příkazu, například -InputObject (Get-Process)
.
Vzhledem k tomu, že InputObject nemůže vrátit jednotlivé vlastnosti z pole nebo kolekce objektů, doporučujeme použít ForEach-Object
k provádění operací s kolekcí objektů pro tyto objekty, které mají určité hodnoty v definovaných vlastnostech, použijete ForEach-Object
v kanálu, jak je znázorněno v příkladech v tomto tématu.
Typ: | PSObject |
Position: | Named |
Default value: | None |
Vyžadováno: | False |
Přijmout vstup kanálu: | True |
Přijmout zástupné znaky: | False |
-MemberName
Určuje vlastnost, která se má získat, nebo metodu volání.
Jsou povoleny zástupné znaky, ale fungují pouze v případě, že se výsledný řetězec přeloží na jedinečnou hodnotu.
Pokud například spustíte Get-Process | ForEach -MemberName *Name
a více než jeden člen existuje s názvem, který obsahuje název řetězce, například ProcessName a Name vlastnosti, příkaz selže.
Tento parametr byl představen ve Windows PowerShellu 3.0.
Typ: | String |
Position: | 0 |
Default value: | None |
Vyžadováno: | True |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | True |
-Process
Určuje operaci, která se provádí u každého vstupního objektu. Zadejte blok skriptu, který popisuje operaci.
Typ: | ScriptBlock[] |
Position: | 0 |
Default value: | None |
Vyžadováno: | True |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | False |
-RemainingScripts
Určuje všechny bloky skriptu, které nejsou převzaty parametrem Process.
Tento parametr byl představen ve Windows PowerShellu 3.0.
Typ: | ScriptBlock[] |
Position: | Named |
Default value: | None |
Vyžadováno: | False |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | False |
-WhatIf
Ukazuje, co se stane, když se rutina spustí. Rutina se nespustí.
Typ: | SwitchParameter |
Aliasy: | wi |
Position: | Named |
Default value: | False |
Vyžadováno: | False |
Přijmout vstup kanálu: | False |
Přijmout zástupné znaky: | False |
Vstupy
Do této rutiny můžete převést libovolný objekt.
Výstupy
Tato rutina vrátí objekty, které jsou určeny vstupem.
Poznámky
- Rutina
ForEach-Object
funguje podobně jako příkaz Foreach s tím rozdílem, že vstup do příkazu Foreach nelze převést. Další informace o příkazu Foreach naleznete v tématu about_Foreach. - Počínaje PowerShellem 4.0 byly přidány metody
Where
aForEach
pro použití s kolekcemi. - Další informace o těchto nových metodách najdete about_arrays