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
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
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
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.
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-Object
zamiast potokowania wyników polecenia w celu 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.
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
Do tego polecenia cmdlet można przekazać dowolny obiekt.
Dane wyjściowe
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 instrukcjiForeach, zobacz about_Foreach . - Począwszy od programu PowerShell 4.0, metody
Where
iForEach
zostały dodane do użycia z kolekcjami. - Więcej informacji na temat tych nowych metod można znaleźć tutaj about_arrays