Udostępnij za pośrednictwem


ForEach-Object

Wykonuje operację względem każdego elementu w kolekcji obiektów wejściowych.

Składnia

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>]

Opis

Polecenie cmdlet ForEach-Object wykonuje operację na każdym elemencie w kolekcji obiektów wejściowych. Obiekty wejściowe mogą być przesyłane potokami do polecenia cmdlet lub określone przy użyciu parametru InputObject.

Począwszy od programu Windows PowerShell 3.0, istnieją dwa różne sposoby konstruowania polecenia ForEach-Object.

  • blok skryptu. Możesz użyć bloku skryptu, aby określić operację. W bloku skryptu użyj zmiennej $_ do reprezentowania bieżącego obiektu. Blok skryptu jest wartością parametru Process. Blok skryptu może zawierać dowolny skrypt programu PowerShell.

    Na przykład następujące polecenie pobiera wartość właściwości ProcessName każdego procesu na komputerze.

    Get-Process | ForEach-Object {$_.ProcessName}

  • instrukcja Operation. Możesz również napisać instrukcję operacji, która jest znacznie bardziej podobna do języka naturalnego. Możesz użyć instrukcji operation, aby określić wartość właściwości lub wywołać metodę. Instrukcje operacji zostały wprowadzone w programie Windows PowerShell 3.0.

    Na przykład następujące polecenie pobiera również wartość właściwości ProcessName każdego procesu na komputerze.

    Get-Process | ForEach-Object ProcessName

    W przypadku korzystania z formatu bloku skryptu, oprócz używania bloku skryptu opisującego operacje wykonywane na każdym obiekcie wejściowym, można podać dwa dodatkowe bloki skryptów. Blok Rozpocznij skrypt, który jest wartością parametru Begin, jest uruchamiany, zanim to polecenie cmdlet przetworzy pierwszy obiekt wejściowy. Blok Końcowy skryptu, który jest wartością parametru End, jest uruchamiany po tym poleceniu cmdlet przetwarza ostatni obiekt wejściowy.

Przykłady

Przykład 1. Dzielenie liczb całkowitych w tablicy

30000, 56798, 12432 | ForEach-Object -Process {$_/1024}

29.296875
55.466796875
12.140625

To polecenie przyjmuje tablicę trzech liczb całkowitych i dzieli każdą z nich przez 1024.

Przykład 2. Pobieranie długości wszystkich plików w katalogu

Get-ChildItem $pshome | ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}

To polecenie pobiera pliki i katalogi w katalogu instalacyjnym programu PowerShell $pshome i przekazuje je do polecenia cmdlet ForEach-Object. Jeśli obiekt nie jest katalogiem, blok skryptu pobiera nazwę pliku, dzieli wartość jego właściwości Length o 1024 i dodaje spację (" ") w celu oddzielenia go od następnego wpisu. Polecenie cmdlet używa właściwości PSISContainer w celu określenia, czy obiekt jest katalogiem.

Przykład 3. Działanie na najnowszych zdarzeniach systemowych

$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}

To polecenie pobiera 1000 najnowszych zdarzeń z dziennika zdarzeń systemu i zapisuje je w zmiennej $Events. Następnie potokuje zdarzenia do polecenia cmdlet ForEach-Object.

Parametr Begin wyświetla bieżącą datę i godzinę. Następnie parametr Process używa polecenia cmdlet Out-File do utworzenia pliku tekstowego o nazwie events.txt i przechowuje właściwość komunikatu każdego zdarzenia w tym pliku. Na koniec parametr zakończenia służy do wyświetlania daty i godziny po zakończeniu całego przetwarzania.

Przykład 4. Zmiana wartości klucza rejestru

Get-ItemProperty -Path HKCU:\Network\* | ForEach-Object {Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper();}

To polecenie zmienia wartość wpisu rejestru RemotePath we wszystkich podkluczach w kluczu HKCU:\Network na wielkie litery. Możesz użyć tego formatu, aby zmienić formularz lub zawartość wartości wpisu rejestru.

Każdy podklucz w kluczu Network reprezentuje zamapowany dysk sieciowy, który ponownie połączy się podczas logowania. Wpis RemotePath zawiera ścieżkę UNC podłączonego dysku. Jeśli na przykład mapujesz dysk E: na \\Server\Share, będzie podklucz E HKCU:\Network i wartość RemotePath wpis rejestru w podkluczu E będzie \\Server\Share.

Polecenie używa polecenia cmdlet , aby pobrać wszystkie podklucze klucza sieci oraz polecenie cmdlet , aby zmienić wartość wpisu rejestru RemotePath w każdym kluczu. W Set-ItemProperty polecenia ścieżka jest wartością właściwości PSPath klucza rejestru. Jest to właściwość obiektu programu Microsoft .NET Framework, która reprezentuje klucz rejestru, a nie wpis rejestru. Polecenie używa metody ToUpper() wartości RemotePath, która jest ciągiem (REG_SZ).

Ponieważ Set-ItemProperty zmienia właściwość każdego klucza, polecenie cmdlet ForEach-Object jest wymagane do uzyskania dostępu do właściwości.

Przykład 5. Używanie zmiennej automatycznej $Null

1, 2, $null, 4 | ForEach-Object {"Hello"}

Hello
Hello
Hello
Hello

W tym przykładzie pokazano efekt potokowania $Null zmiennej automatycznej do polecenia cmdlet ForEach-Object.

Ponieważ program PowerShell traktuje wartość null jako jawny symbol zastępczy, polecenie cmdlet ForEach-Object generuje wartość dla $Null, podobnie jak w przypadku innych obiektów, które są do niego przesyłane potokiem.

Aby uzyskać więcej informacji na temat zmiennej automatycznej $Null, zobacz about_Automatic_Variables.

Przykład 6. Pobieranie wartości właściwości

Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path

Te polecenia pobierają wartość właściwości Path wszystkich zainstalowanych modułów programu PowerShell. Używają parametru MemberName, aby określić właściwość ścieżka modułów.

Drugie polecenie jest równoważne pierwszemu. Używa Foreach aliasu polecenia cmdlet ForEach-Object i pomija nazwę parametru MemberName, który jest opcjonalny.

Polecenie cmdlet jest bardzo przydatne w przypadku pobierania wartości właściwości, ponieważ pobiera wartość bez zmiany typu, w przeciwieństwie do poleceń cmdlet format lub polecenia cmdlet , które zmienia typ wartości właściwości.

Przykład 7. Dzielenie nazw modułów na nazwy składników

"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

Te polecenia dzielą dwie nazwy modułów rozdzielonych kropkami na ich nazwy składników. Polecenia wywołają metodę Split ciągów. Trzy polecenia używają innej składni, ale są równoważne i zamienne.

Pierwsze polecenie używa tradycyjnej składni, która zawiera blok skryptu i bieżący operator obiektu $_. Używa składni kropki, aby określić metodę i nawiasy, aby ująć argument ogranicznika.

Drugie polecenie używa parametru MemberName w celu określenia metody Split oraz parametru ArgumentName w celu zidentyfikowania kropki (".") jako ogranicznika podziału.

Trzecie polecenie używa aliasu Foreach foreach polecenia cmdlet Foreach-Object i pomija nazwy parametrów MemberName i ArgumentList, które są opcjonalne.

Dane wyjściowe tych trzech poleceń, jak pokazano poniżej, są identyczne.

Split to tylko jedna z wielu przydatnych metod ciągów. Aby wyświetlić wszystkie właściwości i metody ciągów, należy przekazać ciąg do polecenia cmdlet Get-Member.

Parametry

-ArgumentList

Określa tablicę argumentów do wywołania metody.

Ten parametr został wprowadzony w programie Windows PowerShell 3.0.

Typ:Object[]
Aliasy:Args
Position:Named
Domyślna wartość:None
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-Begin

Określa blok skryptu uruchamiany przed wykonaniem tego polecenia cmdlet przetwarza wszystkie obiekty wejściowe.

Typ:ScriptBlock
Position:Named
Domyślna wartość:None
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-Confirm

Monituje o potwierdzenie przed uruchomieniem polecenia cmdlet.

Typ:SwitchParameter
Aliasy:cf
Position:Named
Domyślna wartość:False
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-End

Określa blok skryptu uruchamiany po tym poleceniu cmdlet przetwarza wszystkie obiekty wejściowe.

Typ:ScriptBlock
Position:Named
Domyślna wartość:None
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-InputObject

Określa obiekty wejściowe. ForEach-Object uruchamia instrukcję bloku skryptu lub operacji dla każdego obiektu wejściowego. Wprowadź zmienną zawierającą obiekty lub wpisz polecenie lub wyrażenie, które pobiera obiekty.

W przypadku używania parametru InputObject z ForEach-Objectzamiast potokowania wyników polecenia w celu ForEach-Objectwartość InputObject jest traktowana jako pojedynczy obiekt. Jest to prawda, nawet jeśli wartość jest kolekcją, która jest wynikiem polecenia, takiego jak -InputObject (Get-Process). Ponieważ InputObject nie może zwrócić poszczególnych właściwości z tablicy lub kolekcji obiektów, zalecamy, aby w przypadku używania ForEach-Object do wykonywania operacji na kolekcji obiektów dla tych obiektów, które mają określone wartości we zdefiniowanych właściwościach, należy użyć ForEach-Object w potoku, jak pokazano w przykładach w tym temacie.

Typ:PSObject
Position:Named
Domyślna wartość:None
Wymagane:False
Akceptowanie danych wejściowych potoku:True
Akceptowanie symboli wieloznacznych:False

-MemberName

Określa właściwość do pobrania lub metody do wywołania.

Dozwolone są symbole wieloznaczne, ale działają tylko wtedy, gdy wynikowy ciąg jest rozpoznawany jako unikatowa wartość. Jeśli na przykład uruchomisz polecenie Get-Process | ForEach -MemberName *Name, a więcej niż jeden element członkowski istnieje z nazwą zawierającą ciąg Name, taką jak ProcessName i Name właściwości, polecenie zakończy się niepowodzeniem.

Ten parametr został wprowadzony w programie Windows PowerShell 3.0.

Typ:String
Position:0
Domyślna wartość:None
Wymagane:True
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:True

-Process

Określa operację wykonywaną na każdym obiekcie wejściowym. Wprowadź blok skryptu opisujący operację.

Typ:ScriptBlock[]
Position:0
Domyślna wartość:None
Wymagane:True
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-RemainingScripts

Określa wszystkie bloki skryptu, które nie są pobierane przez parametr procesu .

Ten parametr został wprowadzony w programie Windows PowerShell 3.0.

Typ:ScriptBlock[]
Position:Named
Domyślna wartość:None
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

-WhatIf

Pokazuje, co się stanie, jeśli polecenie cmdlet zostanie uruchomione. Polecenie cmdlet nie jest uruchamiane.

Typ:SwitchParameter
Aliasy:wi
Position:Named
Domyślna wartość:False
Wymagane:False
Akceptowanie danych wejściowych potoku:False
Akceptowanie symboli wieloznacznych:False

Dane wejściowe

PSObject

Do tego polecenia cmdlet można przekazać dowolny obiekt.

Dane wyjściowe

PSObject

To polecenie cmdlet zwraca obiekty określone przez dane wejściowe.

Uwagi

  • Polecenie cmdlet ForEach-Object działa podobnie jak instrukcja Foreach, z tą różnicą, że nie można przekazać danych wejściowych do instrukcji Foreach. Aby uzyskać więcej informacji na temat instrukcji Foreach, zobacz about_Foreach.
  • Począwszy od programu PowerShell 4.0, metody Where i ForEach zostały dodane do użycia z kolekcjami.
  • Więcej informacji na temat tych nowych metod można znaleźć tutaj about_arrays