ForEach-Object
Wykonuje operację względem każdego elementu w kolekcji obiektów wejściowych.
Składnia
ScriptBlockSet (domyślnie)
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>]
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 ProcessNameW 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
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 Set-ItemProperty ś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
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
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.
Właściwości parametru
| Typ: | Object[] |
| Domyślna wartość: | None |
| Obsługuje symbole wieloznaczne: | False |
| DontShow: | False |
| Aliasy: | Argumenty |
Zestawy parametrów
PropertyAndMethodSet
| Position: | Named |
| Obowiązkowe: | False |
| Wartość z potoku: | False |
| Wartość z potoku według nazwy właściwości: | False |
| Wartość z pozostałych argumentów: | False |
-Begin
Określa blok skryptu uruchamiany przed wykonaniem tego polecenia cmdlet przetwarza wszystkie obiekty wejściowe.
Właściwości parametru
| Typ: | ScriptBlock |
| Domyślna wartość: | None |
| Obsługuje symbole wieloznaczne: | False |
| DontShow: | False |
Zestawy parametrów
ScriptBlockSet
| Position: | Named |
| Obowiązkowe: | False |
| Wartość z potoku: | False |
| Wartość z potoku według nazwy właściwości: | False |
| Wartość z pozostałych argumentów: | False |
-Confirm
Prosi o potwierdzenie przed uruchomieniem cmdletu.
Właściwości parametru
| Typ: | SwitchParameter |
| Domyślna wartość: | False |
| Obsługuje symbole wieloznaczne: | False |
| DontShow: | False |
| Aliasy: | por |
Zestawy parametrów
(All)
| Position: | Named |
| Obowiązkowe: | False |
| Wartość z potoku: | False |
| Wartość z potoku według nazwy właściwości: | False |
| Wartość z pozostałych argumentów: | False |
-End
Określa blok skryptu uruchamiany po tym poleceniu cmdlet przetwarza wszystkie obiekty wejściowe.
Właściwości parametru
| Typ: | ScriptBlock |
| Domyślna wartość: | None |
| Obsługuje symbole wieloznaczne: | False |
| DontShow: | False |
Zestawy parametrów
ScriptBlockSet
| Position: | Named |
| Obowiązkowe: | False |
| Wartość z potoku: | False |
| Wartość z potoku według nazwy właściwości: | False |
| Wartość z pozostałych argumentów: | 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.
Jeśli używasz parametru InputObject z parametrem ForEach-Object, zamiast potokowania wyników polecenia do ForEach-Object, wartość 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.
Właściwości parametru
| Typ: | PSObject |
| Domyślna wartość: | None |
| Obsługuje symbole wieloznaczne: | False |
| DontShow: | False |
Zestawy parametrów
(All)
| Position: | Named |
| Obowiązkowe: | False |
| Wartość z potoku: | True |
| Wartość z potoku według nazwy właściwości: | False |
| Wartość z pozostałych argumentów: | 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.
Właściwości parametru
| Typ: | String |
| Domyślna wartość: | None |
| Obsługuje symbole wieloznaczne: | True |
| DontShow: | False |
Zestawy parametrów
PropertyAndMethodSet
| Position: | 0 |
| Obowiązkowe: | True |
| Wartość z potoku: | False |
| Wartość z potoku według nazwy właściwości: | False |
| Wartość z pozostałych argumentów: | False |
-Process
Określa operację wykonywaną na każdym obiekcie wejściowym. Wprowadź blok skryptu opisujący operację.
Właściwości parametru
| Typ: | ScriptBlock[] |
| Domyślna wartość: | None |
| Obsługuje symbole wieloznaczne: | False |
| DontShow: | False |
Zestawy parametrów
ScriptBlockSet
| Position: | 0 |
| Obowiązkowe: | True |
| Wartość z potoku: | False |
| Wartość z potoku według nazwy właściwości: | False |
| Wartość z pozostałych argumentów: | 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.
Właściwości parametru
| Typ: | ScriptBlock[] |
| Domyślna wartość: | None |
| Obsługuje symbole wieloznaczne: | False |
| DontShow: | False |
Zestawy parametrów
ScriptBlockSet
| Position: | Named |
| Obowiązkowe: | False |
| Wartość z potoku: | False |
| Wartość z potoku według nazwy właściwości: | False |
| Wartość z pozostałych argumentów: | False |
-WhatIf
Pokazuje, co się stanie, jeśli polecenie cmdlet zostanie uruchomione. Cmdlet nie jest uruchomiony.
Właściwości parametru
| Typ: | SwitchParameter |
| Domyślna wartość: | False |
| Obsługuje symbole wieloznaczne: | False |
| DontShow: | False |
| Aliasy: | Wi |
Zestawy parametrów
(All)
| Position: | Named |
| Obowiązkowe: | False |
| Wartość z potoku: | False |
| Wartość z potoku według nazwy właściwości: | False |
| Wartość z pozostałych argumentów: | False |
CommonParameters
To polecenie cmdlet obsługuje typowe parametry: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction i -WarningVariable. Aby uzyskać więcej informacji, zobacz about_CommonParameters.
Dane wejściowe
PSObject
Do tego polecenia cmdlet można przekierować dowolny obiekt.
Dane wyjściowe
PSObject
To polecenie cmdlet zwraca obiekty określone przez dane wejściowe.
Uwagi
- Polecenie cmdlet
ForEach-Objectdział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 instrukcjiForeach, zobacz about_Foreach . - Począwszy od programu PowerShell 4.0, metody
WhereiForEachzostały dodane do użycia z kolekcjami. - Więcej informacji na temat tych nowych metod można znaleźć tutaj about_arrays