ForEach-Object
Provede operaci s každou položkou v kolekci vstupních objektů.
Syntax
ScriptBlockSet (Výchozí)
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
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.
Syntaxe bloku 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}ForEach-Objectbeginpodporuje ,processaendbloky, jak je popsáno v about_Functions.Poznámka:
Bloky skriptu se spouštějí v oboru volajícího. Bloky proto mají přístup k proměnným v daném oboru a můžou vytvářet nové proměnné, které se v daném oboru zachovají po dokončení rutiny.
Zjednodušená syntaxe Pomocí zjednodušené syntaxe zadáte vlastnost nebo název metody objektu v kanálu.
ForEach-Objectvrátí hodnotu vlastnosti nebo metody pro každý objekt v kanálu.Například následující příkaz také získá hodnotu ProcessName vlastnost každého procesu v počítači.
Get-Process | ForEach-Object ProcessNameZjednodušená syntaxe byla zavedena ve Windows PowerShellu 3.0. Další informace najdete v tématu about_Simplified_Syntax.
Příklady
Příklad 1: Dělení celých čísel v matici
V tomto příkladu se používá pole se třemi celými čísly a každý z nich vydělí číslem 1024.
30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625
Příklad 2: Získání délky všech souborů v adresáři
Tento příklad zpracovává soubory a adresáře v instalačním adresáři PowerShellu $PSHOME.
Get-ChildItem $PSHOME | ForEach-Object -Process {
if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }
}
Pokud objekt není adresář, blok skriptu získá název souboru, vydělí hodnotu jeho vlastnosti Length hodnotou 1024 a přidá mezeru (" ") k jeho oddělení od další položky. Rutina používá vlastnost PSIsContainer k určení, zda je objekt adresáře.
Příklad 3: Operace s nejnovějšími událostmi systému
Tento příklad zapíše 1000 nejnovějších událostí z protokolu událostí systému do textového souboru. Aktuální čas se zobrazí před a po zpracování událostí.
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 získá 1000 nejnovějších událostí z protokolu událostí systému a předá je do rutiny ForEach-Object. Parametr Begin zobrazuje aktuální datum a čas. Parametr Process dále pomocí rutiny Out-File vytvoří textový soubor s názvem events.txt a uloží vlastnost zprávy jednotlivých událostí v daném souboru. Nakonec se parametr End použije k zobrazení data a času po dokončení veškerého zpracování.
Příklad 4: Změna hodnoty klíče registru
Tento příklad změní hodnotu položky registru RemotePath ve všech podklíčích pod HKCU:\Network klíčem na velká písmena textu.
Get-ItemProperty -Path HKCU:\Network\* |
ForEach-Object {
Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper()
}
Tento formát můžete použít ke změně formuláře nebo obsahu hodnoty položky registru.
Každý podklíč v síťovém klíči představuje namapovanou 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\Sharepodklíč E , vytvoří se podklíč HKCU:\Network E s hodnotou registru RemotePath nastavenou na \\Server\Sharehodnotu .
Příkaz pomocí rutiny Get-ItemProperty získá všechny podklíče síťového klíče a rutiny Set-ItemProperty ke změně hodnoty položky registru RemotePath v každém klíči.
Set-ItemProperty V příkazu 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 ToUpper() hodnoty RemotePath , což je řetězec REG_SZ.
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é
Tento příklad ukazuje účinek propojení $null automatické proměnné do rutiny ForEach-Object.
1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello
Vzhledem k tomu, že PowerShell považuje $null za explicitní zástupný symbol, rutina ForEach-Object vygeneruje hodnotu pro $null stejně jako pro ostatní objekty předané do něj.
Příklad 6: Získání hodnot vlastností
Tento příklad získá hodnotu Path vlastnost všech nainstalovaných modulů PowerShellu pomocí parametru MemberName rutiny ForEach-Object .
Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | foreach Path
Druhý příkaz je ekvivalentní prvnímu příkazu. Používá Foreach alias ForEach-Object rutiny a vynechá název parametru MemberName , který je volitelný.
Rutina ForEach-Object je užitečná pro získání hodnot vlastností, protože získá hodnotu beze změny typu, na rozdíl od rutin Format nebo rutiny Select-Object , která změní typ hodnoty vlastnosti.
Příklad 7: Rozdělení názvů modulů na názvy komponent
Tento příklad ukazuje tři způsoby rozdělení dvou názvů 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é. Výstup je stejný pro všechny tři případy.
"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
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 používá parametr MemberName k určení Split metoda aArgumentList parametr identifikovat tečku (.) jako oddělovač rozdělení.
Třetí příkaz používá foreach alias ForEach-Object rutiny a vynechá názvy parametrů MemberName a ArgumentList , které jsou volitelné.
Příklad 8: Použití ForEach-Object se dvěma bloky skriptu
V tomto příkladu předáme dva bloky skriptu pozičním způsobem. Všechny bloky skriptu se sváže s parametrem Process . Považují se však za to, že byly předány parametrům Begin a Process .
1..2 | ForEach-Object { 'begin' } { 'process' }
begin
process
process
Příklad 9: Použití ForEach-Object s více než dvěma bloky skriptu
V tomto příkladu předáváme pozičním způsobem čtyři bloky skriptu. Všechny bloky skriptu se sváže s parametrem Process . Považují se však za to, že byly předány parametrům Begin, Process a End .
1..2 | ForEach-Object { 'begin' } { 'process A' } { 'process B' } { 'end' }
begin
process A
process B
process A
process B
end
Poznámka:
První blok skriptu se vždy mapuje na blok begin, poslední blok se mapuje na blok end a oba prostřední bloky se mapují na blok process.
Příklad 10: Spuštění více bloků skriptů pro každou položku kanálu
Jak je znázorněno v předchozím příkladu, několik bloků skriptu předaných pomocí parametru Process se mapuje na parametry Begin a End . Chcete-li se tomuto mapování vyhnout, je nutné zadat explicitní hodnoty parametrů Begin a End .
1..2 | ForEach-Object -Begin $null -Process { 'one' }, { 'two' }, { 'three' } -End $null
one
two
three
one
two
three
Parametry
-ArgumentList
Určuje pole argumentů pro volání metody. Další informace o chování ArgumentListnajdete v části about_Splatting.
Tento parametr byl představen ve Windows PowerShellu 3.0.
Vlastnosti parametru
| Typ: | Object[] |
| Default value: | None |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
| Aliasy: | Argumenty |
Sady parametrů
PropertyAndMethodSet
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-Begin
Určuje blok skriptu, který se spustí před tím, než tato rutina zpracuje všechny vstupní objekty. Tento blok skriptu se spustí pouze jednou pro celý kanál. Další informace o begin bloku najdete v tématu about_Functions.
Vlastnosti parametru
| Typ: | ScriptBlock |
| Default value: | None |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
ScriptBlockSet
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-Confirm
Před spuštěním cmdletu vás vyzve k potvrzení.
Vlastnosti parametru
| Typ: | SwitchParameter |
| Default value: | False |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
| Aliasy: | viz |
Sady parametrů
(All)
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-End
Určuje blok skriptu, který se spustí po této rutině, zpracuje všechny vstupní objekty. Tento blok skriptu se spustí pouze jednou pro celý kanál. Další informace o end bloku najdete v tématu about_Functions.
Vlastnosti parametru
| Typ: | ScriptBlock |
| Default value: | None |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
ScriptBlockSet
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | 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 výsledky do 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 vracet jednotlivé vlastnosti z pole nebo kolekce objektů, doporučujeme, abyste v případě ForEach-Object použití 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.
Vlastnosti parametru
| Typ: | PSObject |
| Default value: | None |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
(All)
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | True |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-MemberName
Určuje název vlastnosti člena pro získání nebo metodu člena volání. Členy musí být členy instance, nikoli statické členy.
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, vzor se zástupným znakem shoduje s více než jedním členem, což způsobí selhání příkazu.
Tento parametr byl představen ve Windows PowerShellu 3.0.
Vlastnosti parametru
| Typ: | String |
| Default value: | None |
| Podporuje zástupné znaky: | True |
| DontShow: | False |
Sady parametrů
PropertyAndMethodSet
| Position: | 0 |
| Povinné: | True |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-Process
Určuje operaci, která se provádí u každého vstupního objektu. Tento blok skriptu se spouští pro každý objekt v kanálu. Další informace o process bloku najdete v tématu about_Functions.
Pokud do parametru Process zadáte více bloků skriptu, první blok skriptu se vždy mapuje na begin blok. Pokud existují jenom dva bloky skriptu, druhý blok se mapuje na process blok. Pokud existují tři nebo více bloků skriptu, první blok skriptu se vždy mapuje na blok begin, poslední blok se mapuje na blok end a prostřední bloky se mapují na blok process.
Vlastnosti parametru
| Typ: | |
| Default value: | None |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
ScriptBlockSet
| Position: | 0 |
| Povinné: | True |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-RemainingScripts
Určuje všechny bloky skriptu, které nejsou převzaty parametrem Process .
Tento parametr byl představen ve Windows PowerShellu 3.0.
Vlastnosti parametru
| Typ: | |
| Default value: | None |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
Sady parametrů
ScriptBlockSet
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
-WhatIf
Ukazuje, co se stane, když se příkaz spustí. Cmdlet se nespustil.
Vlastnosti parametru
| Typ: | SwitchParameter |
| Default value: | False |
| Podporuje zástupné znaky: | False |
| DontShow: | False |
| Aliasy: | Wi |
Sady parametrů
(All)
| Position: | Named |
| Povinné: | False |
| Hodnota z kanálu: | False |
| Hodnota z kanálu podle názvu vlastnosti: | False |
| Hodnota ze zbývajících argumentů: | False |
CommonParameters
Tato rutina podporuje běžné parametry: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction a -WarningVariable. Další informace najdete v about_CommonParameters.
Vstupy
PSObject
K tomuto cmdletu můžete přesměrovat libovolný objekt.
Výstupy
PSObject
Tato rutina vrátí objekty, které jsou určeny vstupem.
Poznámky
Windows PowerShell obsahuje následující aliasy pro ForEach-Object:
%foreach
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 foreach příkazu najdete v tématu about_Foreach.
Počínaje PowerShellem 4.0 byly přidány metody Where a ForEach pro použití s kolekcemi. Další informace o těchto nových metodách najdete about_Arrays