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 ForEach-Object
cmdlet 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 ForEach-Object
polecenia.
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}
ForEach-Object
program obsługuje blokibegin
,process
iend
zgodnie z opisem w about_functions.Uwaga
Bloki skryptu są uruchamiane w zakresie wywołującego. W związku z tym bloki mają dostęp do zmiennych w tym zakresie i mogą tworzyć nowe zmienne, które utrzymują się w tym zakresie po zakończeniu wykonywania polecenia cmdlet.
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
Przykłady
Przykład 1. Dzielenie liczb całkowitych w tablicy
W tym przykładzie jest pobierana tablica trzech liczb całkowitych i dzieli każdą z nich o 1024.
30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625
Przykład 2. Pobieranie długości wszystkich plików w katalogu
W tym przykładzie pliki i katalogi są przetwarzane w katalogu $PSHOME
instalacyjnym programu PowerShell .
Get-ChildItem $PSHOME |
ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}
Jeśli obiekt nie jest katalogiem, blok skryptu pobiera nazwę pliku, dzieli wartość właściwości Length przez 1024 i dodaje spację (""), aby oddzielić ją od następnego wpisu. Polecenie cmdlet używa właściwości PSISContainer , aby określić, czy obiekt jest katalogiem.
Przykład 3. Działanie na najnowszych zdarzeniach systemowych
W tym przykładzie jest zapisywanych 1000 najnowszych zdarzeń z dziennika zdarzeń systemu do pliku tekstowego. Bieżący czas jest wyświetlany przed i po przetworzeniu zdarzeń.
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
Pobiera 1000 najnowszych zdarzeń z dziennika zdarzeń systemu i potokuje je do ForEach-Object
polecenia cmdlet. Parametr Begin wyświetla bieżącą datę i godzinę. Następnie parametr Process używa Out-File
polecenia cmdlet do utworzenia pliku tekstowego o nazwie events.txt i przechowuje właściwość komunikatu każdego zdarzenia w tym pliku. Na koniec parametr End służy do wyświetlania daty i godziny po zakończeniu całego przetwarzania.
Przykład 4. Zmiana wartości klucza rejestru
Ten przykład zmienia wartość wpisu rejestru RemotePath we wszystkich podkluczach pod kluczem HKCU:\Network
na wielkie litery.
Get-ItemProperty -Path HKCU:\Network\* |
ForEach-Object {
Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper()
}
Możesz użyć tego formatu, aby zmienić formularz lub zawartość wartości wpisu rejestru.
Każdy podklucz w kluczu sieci reprezentuje zamapowany dysk sieciowy, który ponownie łączy się podczas logowania. Wpis RemotePath zawiera ścieżkę UNC podłączonego dysku. Jeśli na przykład zamapujesz E:
dysk na \\Server\Share
, zostanie utworzony HKCU:\Network
podklucz E z wartością rejestru RemotePath ustawioną na \\Server\Share
wartość .
Polecenie używa Get-ItemProperty
polecenia cmdlet , aby pobrać wszystkie podklucze klucza sieciowego i Set-ItemProperty
polecenie cmdlet, aby zmienić wartość wpisu rejestru RemotePath w każdym kluczu. W poleceniu 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, ForEach-Object
polecenie cmdlet jest wymagane do uzyskania dostępu do właściwości.
Przykład 5. Używanie zmiennej automatycznej $null
W tym przykładzie pokazano efekt potokowania zmiennej automatycznej $null
do ForEach-Object
polecenia cmdlet.
1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello
Ponieważ program PowerShell traktuje $null
jako jawny symbol zastępczy, ForEach-Object
polecenie cmdlet generuje wartość dla $null
elementu , tak jak w przypadku innych obiektów potokowych do niego.
Przykład 6. Pobieranie wartości właściwości
Ten przykład pobiera wartość właściwości Path wszystkich zainstalowanych modułów programu PowerShell przy użyciu parametru ForEach-Object
MemberName polecenia cmdlet.
Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path
Drugie polecenie jest równoważne pierwszemu. Używa Foreach
aliasu ForEach-Object
polecenia cmdlet i pomija nazwę parametru MemberName , który jest opcjonalny.
Polecenie ForEach-Object
cmdlet jest przydatne do pobierania wartości właściwości, ponieważ pobiera wartość bez zmiany typu, w przeciwieństwie do poleceń cmdlet Format lub Select-Object
polecenia cmdlet, które zmieniają typ wartości właściwości.
Przykład 7. Dzielenie nazw modułów na nazwy składników
W tym przykładzie przedstawiono trzy sposoby dzielenia dwóch nazw 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. Dane wyjściowe są takie same dla wszystkich trzech przypadkó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
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 , aby określić metodę Split i parametr ArgumentList w celu zidentyfikowania kropki (.
) jako ogranicznika podziału.
Trzecie polecenie używa aliasu ForEach-Object
Foreach polecenia cmdlet i pomija nazwy parametrów MemberName i ArgumentList, które są opcjonalne.
Przykład 8: Używanie obiektu ForEach-Object z dwoma blokami skryptu
W tym przykładzie przekazujemy dwa bloki skryptu pozycjonalnie. Wszystkie bloki skryptu są powiązane z parametrem Proces . Są one jednak traktowane tak, jakby zostały przekazane do parametrów Begin i Process .
1..2 | ForEach-Object { 'begin' } { 'process' }
begin
process
process
Przykład 9: Używanie obiektu ForEach-Object z więcej niż dwoma blokami skryptu
W tym przykładzie przekazujemy cztery bloki skryptu pozycjonalnie. Wszystkie bloki skryptu są powiązane z parametrem Proces . Są one jednak traktowane tak, jakby zostały przekazane do parametrów Begin, Process i End .
1..2 | ForEach-Object { 'begin' } { 'process A' } { 'process B' } { 'end' }
begin
process A
process B
process A
process B
end
Uwaga
Pierwszy blok skryptu jest zawsze mapowany na begin
blok, ostatni blok jest mapowany na end
blok, a dwa środkowe bloki są mapowane na process
blok.
Przykład 10: Uruchamianie wielu bloków skryptów dla każdego elementu potoku
Jak pokazano w poprzednim przykładzie, wiele bloków skryptu przekazanych przy użyciu parametru Proces jest mapowane na parametry Początek i Koniec . Aby uniknąć tego mapowania, należy podać jawne wartości parametrów Begin i End .
1..2 | ForEach-Object -Begin $null -Process { 'one' }, { 'two' }, { 'three' } -End $null
one
two
three
one
two
three
Parametry
-ArgumentList
Określa tablicę argumentów do wywołania metody. Aby uzyskać więcej informacji na temat zachowania argumentlist, zobacz about_Splatting.
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. Ten blok skryptu jest uruchamiany tylko raz dla całego potoku. Aby uzyskać więcej informacji na temat begin
bloku, zobacz about_Functions.
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. Ten blok skryptu jest uruchamiany tylko raz dla całego potoku. Aby uzyskać więcej informacji na temat end
bloku, zobacz about_Functions.
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.
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ż obiekt InputObject nie może zwracać pojedynczych właściwości z tablicy lub kolekcji obiektów, zalecamy, aby w przypadku ForEach-Object
używania 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 nazwę właściwości elementu członkowskiego, która ma być wywoływana, lub metoda składowa. Składowe muszą być członkami wystąpienia, a nie statycznych elementów członkowskich.
Dozwolone są symbole wieloznaczne, ale działają tylko wtedy, gdy wynikowy ciąg jest rozpoznawany jako unikatowa wartość.
Jeśli na przykład uruchomisz Get-Process | ForEach -MemberName *Name
polecenie , wzorzec wieloznaczny pasuje do więcej niż jednego elementu członkowskiego, co powoduje niepowodzenie polecenia.
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. Ten blok skryptu jest uruchamiany dla każdego obiektu w potoku. Aby uzyskać więcej informacji na temat process
bloku, zobacz about_Functions.
Po podaniu wielu bloków skryptu do parametru Proces pierwszy blok skryptu jest zawsze mapowany na begin
blok. Jeśli istnieją tylko dwa bloki skryptów, drugi blok jest mapowany na process
blok. Jeśli istnieją co najmniej trzy bloki skryptu, pierwszy blok skryptu jest zawsze mapowany na begin
blok, ostatni blok jest mapowany na end
blok, a środkowe bloki są mapowane na process
blok.
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 Process .
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 po uruchomieniu polecenia cmdlet. 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
Program Windows PowerShell zawiera następujące aliasy dla programu ForEach-Object
:
%
foreach
Polecenie ForEach-Object
cmdlet 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, Where
a ForEach
metody zostały dodane do użycia z kolekcjami. Więcej informacji na temat tych nowych metod można znaleźć tutaj about_arrays