Sdílet prostřednictvím


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 ToUpper() 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é

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 je velmi užitečná pro získání hodnot vlastností, protože získá hodnotu beze změny typu, na rozdíl od rutin formátu nebo rutiny , která změní typ hodnoty vlastnosti.

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 Foreach rutiny Foreach-Object a vynechá názvy MemberName a ArgumentList parametry, které jsou volitelné.

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 *Namea 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

PSObject

Do této rutiny můžete převést libovolný objekt.

Výstupy

PSObject

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 a ForEach pro použití s kolekcemi.
  • Další informace o těchto nových metodách najdete about_arrays