Wykonuje operację przeciwko każdemu elementowi w kolekcji obiektów wejściowych.
Syntax
ForEach-Object <ScriptBlock> >]
ForEach-Object <String> >]
ForEach-Object -Parallel <scriptblock>
Opis
Centletu ForEach-Object
cmdlet wykonuje operację na każdym elemencie w kolekcji obiektów wejściowych. Obiekty wejściowe mogą być przekazywane do cmdleta lub określone za pomocą parametru InputObject.
Począwszy od Windows PowerShell 3.0, istnieją dwa różne sposoby konstruowania ForEach-Object
polecenia.
-
Blok skryptu. Możesz użyć bloku skryptu do określenia operacji. Wewnątrz bloku skryptu, użyj zmiennej
$_
do reprezentowania bieżącego obiektu. Blok skryptu jest wartością parametruProcess. Blok skryptu może zawierać dowolny skrypt PowerShell.Na przykład poniższe polecenie pobiera wartość właściwości ProcessName każdego procesu na komputerze.
Get-Process | ForEach-Object {$_.ProcessName}
ForEach-Object
obsługujebegin
process
, orazend
bloki opisane wabout_functions.Uwaga
Bloki skryptu działają w zakresie wywołującego. Dlatego bloki mają dostęp do zmiennych w tym zakresie i mogą tworzyć nowe zmienne, które pozostają w tym zakresie po zakończeniu działania cmdleta.
-
Określenie operacji. Można również napisać instrukcję operacji, która jest bardziej podobna do naturalnego języka. Możesz użyć instrukcji obsługi, aby określić wartość właściwości lub wywołać metodę. Instrukcje operacyjne zostały wprowadzone w Windows PowerShell 3.0.
Na przykład, poniższe polecenie pobiera również wartość właściwości ProcessName każdego procesu na komputerze.
Get-Process | ForEach-Object ProcessName
-
Blok skryptu działającego równolegle. Począwszy od wersji PowerShell 7.0 dostępny jest trzeci zestaw parametrów, który uruchamia każdy blok skryptu równolegle. Parametr ThrottleLimit ogranicza liczbę równolegle działających skryptów w danym momencie. Tak jak poprzednio, należy użyć zmiennej
$_
do reprezentowania bieżącego obiektu wejściowego w bloku skryptu. Użyj słowa kluczowego$using:
do przekazania referencji do zmiennych w uruchomionym skrypcie.W PowerShell 7, nowa przestrzeń uruchomieniowa jest tworzona dla każdej iteracji pętli, aby zapewnić maksymalną izolację.Może to być duże obciążenie wydajności i zasobów, jeśli praca, którą wykonujesz, jest niewielka w porównaniu do tworzenia nowych przestrzeni uruchomieniowych lub jeśli jest wiele iteracji wykonujących znaczącą pracę. Od wersji 7.1 PowerShell, przestrzeń uruchomieniowa z puli przestrzeni uruchomieniowej jest domyślnie używana ponownie. Rozmiar puli runspace określany jest przez parametr ThrottleLimit. Domyślny rozmiar puli przestrzeni startowej wynosi 5. Nadal można utworzyć nową przestrzeń startową dla każdej iteracji za pomocą przełącznika UseNewRunspace.
Domyślnie równoległe bloki skryptów używają bieżącego katalogu roboczego wywołującego, który uruchomił zadania równoległe.
Błędy nie kończące się są zapisywane do strumienia błędów cmdleta, gdy występują w równolegle uruchamianych blokach skryptów. Ponieważ nie można określić kolejności wykonywania równoległych bloków skryptów, kolejność, w jakiej błędy pojawiają się w strumieniu błędów, jest przypadkowa. Podobnie komunikaty zapisywane do innych strumieni danych, takie jak ostrzeżenia, komunikaty słowne lub informacje, są zapisywane do tych strumieni danych w nieokreślonej kolejności.
Błędy kończące, takie jak wyjątki, kończą poszczególne równoległe instancje bloków skryptów, w których występują. Błąd kończący w jednym z bloków skryptów może nie spowodować zakończenia działania cmdleta
Foreach-Object
. Pozostałe bloki skryptów, działające równolegle, kontynuują działanie, chyba że również napotkają błąd kończący działanie. Błąd kończący zapisywany jest do strumienia danycherror jako ErrorRecord z FullyQualifiedErrorId o wartościPSTaskException
.Błędy kończące można przekształcić w błędy niekończące za pomocą PowerShell try/catch lub trapblocks.
Przykłady
Przykład 1: Dzielenie liczb całkowitych w tablicy
Ten przykład pobiera tablicę trzech liczb całkowitych i dzieli każdą z nich przez 1024.
30000, 56798, 12432 | ForEach-Object -Process {$_/1024}29.29687555.46679687512.140625
Przykład 2: Uzyskaj długość wszystkich plików w katalogu
Ten przykład przetwarza pliki i katalogi w katalogu instalacyjnym PowerShell $PSHOME
.
Get-ChildItem $PSHOME | ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}
Jeżeli obiekt nie jest katalogiem, blok skryptu pobiera nazwę pliku, dzieli wartość jego właściwości Length przez 1024 i dodaje spację (” „), aby oddzielić go od następnego wpisu. Polecenie używa właściwości PSISContainer do określenia, czy obiekt jest katalogiem.
Przykład 3: Operacje na najnowszych zdarzeniach Systemu
Przykład ten zapisuje 1000 najnowszych zdarzeń z dziennika zdarzeń Systemu do pliku tekstowego. Przed i po przetworzeniu zdarzeń wyświetlany jest aktualny czas.
$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}
Get-EventLog
Pobiera 1000 najnowszych zdarzeń z dziennika zdarzeń Systemu i zapisuje je w zmiennej$Events
. Zmienna $Events
jest następnie przekazywana do cmdletu ForEach-Object
. Parametr Begin wyświetla aktualną datę i godzinę. Następnie parametr Process używa polecenia Out-File
cmdlet do utworzenia pliku tekstowego o nazwie events.txt i zapisania w nim właściwości wiadomości dla każdego ze zdarzeń. Parametr End jest używany do wyświetlania daty i godziny po zakończeniu przetwarzania.
Przykład 4: Zmiana wartości klucza rejestru
Przykład ten zmienia wartość wpisu RemotePath we wszystkich podkluczy pod kluczemHKCU:\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 do zmiany formy lub zawartości wartości wpisu w rejestrze.
Każdy podklucze w kluczu Network reprezentuje zmapowany dysk sieciowy, który łączy się ponownie przy logowaniu. WpisRemotePath zawiera ścieżkę UNC podłączonego dysku. Na przykład, jeśli dysk E:zostanie zmapowany do \\Server\Share
, klucz podrzędny E zostanie utworzony w HKCU:\Network
z wartością RemotePathregistry ustawioną na \\Server\Share
.
Polecenie używa polecenia Get-ItemProperty
cmdlet, aby uzyskać wszystkie podklucze klucza Network, oraz polecenia Set-ItemProperty
cmdlet, aby zmienić wartość wpisu w rejestrze 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 Microsoft .NET Framework, która reprezentuje klucz rejestru, a nie wpis w rejestrze. Polecenie wykorzystuje metodę ToUpper() wartości RemotePath, która jest ciągiem znaków (REG_SZ).
Ponieważ Set-ItemProperty
zmienia właściwość każdego klucza, cmdlet ForEach-Object
jest wymagany do uzyskania dostępu do właściwości.
Przykład 5: Użyj zmiennej automatycznej $Null
Przykład ten pokazuje efekt przekazania zmiennej automatycznej $Null
do cmdletu ForEach-Object
cmdlet.
1, 2, $null, 4 | ForEach-Object {"Hello"}HelloHelloHelloHello
Ponieważ PowerShell traktuje null jako jawny placeholder, cmdlet ForEach-Object
generuje wartość dla $Null
, tak samo jak dla innych obiektów, które do niego przesyłamy.
Przykład 6: Uzyskaj wartości właściwości
Ten przykład uzyskuje wartość właściwości Path wszystkich zainstalowanych modułów PowerShell przez użycie parametru MemberName cmdleta ForEach-Object
.
Get-Module -ListAvailable | ForEach-Object -MemberName PathGet-Module -ListAvailable | Foreach Path
Drugie polecenie jest równoważne pierwszemu. Wykorzystuje ono alias Foreach
cmdleta ForEach-Object
cmdleta i pomija nazwę parametru MemberName, który jest opcjonalny.
Sztuczka ForEach-Object
cmdlet jest przydatna do uzyskiwania wartości właściwości, ponieważ pobiera wartość bez zmiany typu, w przeciwieństwie do poleceń Format lub Select-Object
cmdlet, które zmieniają typ wartości właściwości.
Przykład 7: Podział nazw modułów na nazwy komponentów
Przykład ten pokazuje trzy sposoby podziału dwóch rozdzielonych kropkami nazw modułów na ich nazwy składowe.
"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 "."MicrosoftPowerShellCoreMicrosoftPowerShellHost
Polecenia wywołują metodę Split dla łańcuchów. Trzy polecenia używają różnej składni, ale są równoważne i można je stosować zamiennie.
Pierwsze polecenie używa tradycyjnej składni, która zawiera blok skryptu i bieżący objectoperator $_
. Używa składni kropkowej do określenia metody i nawiasów do zamknięcia delimiteraargumentu.
Drugie polecenie używa parametru MemberName do określenia metody Split i parametruArgumentName do wskazania kropki („.”) jako delimitera podziału.
Trzecie polecenie wykorzystuje alias Foreach cmdleta ForEach-Object
i pomija nazwy parametrów MemberName i ArgumentList, które są opcjonalne.
Przykład 8: Użycie ForEach-Object z dwoma blokami skryptów
W tym przykładzie przekazujemy dwa bloki skryptów pozycyjnie. Wszystkie bloki skryptów wiążą się z parametremProcess. Są one jednak traktowane tak, jakby zostały przekazane do parametrów Begin iProcess.
1..2 | ForEach-Object { 'begin' } { 'process' }beginprocessprocess
Przykład 9: Użycie ForEach-Object z więcej niż dwoma blokami skryptów
W tym przykładzie przekazujemy dwa bloki skryptów pozycyjnie. Wszystkie bloki skryptów wiążą się z parametremProcess. 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' }beginprocess Aprocess Bprocess Aprocess Bend
Uwaga
Pierwszy blok skryptu jest zawsze mapowany do bloku begin
, ostatni blok jest mapowany do blokuend
, a wszystkie bloki pomiędzy nimi są mapowane do bloku process
.
Przykład 10: Uruchom wiele bloków skryptów dla każdego elementu rurociągu
Jak pokazano w poprzednim przykładzie, wiele bloków skryptów przekazanych za pomocą parametru Process getmapped do parametrów Begin i End. Aby uniknąć tego odwzorowania, należy podać jawne wartości dla parametrów Begin i End.
1..2 | ForEach-Object -Begin $null -Process { 'one' }, { 'two' }, { 'three' } -End $nullonetwothreeonetwothree
Przykład 11: Uruchamiaj powolny skrypt w równoległych partiach
Ten przykład uruchamia prosty blok skryptu, który oblicza ciąg znaków i śpi przez jedną sekundę.
$Message = "Output:"1..8 | ForEach-Object -Parallel { "$using:Message $_" Start-Sleep 1} -ThrottleLimit 4Output: 1Output: 2Output: 3Output: 4Output: 5Output: 6Output: 7Output: 8
Wartość parametru ThrottleLimit jest ustawiona na 4, tak że dane wejściowe są przetwarzane w partiach po cztery.Słowo kluczowe $using:
jest używane do przekazywania zmiennej $Message
do każdego bloku skryptu równoległego.
Przykład 12: Pobieranie wpisów dziennika równolegle
Ten przykład pobiera 50 000 wpisów dziennika z 5 dzienników systemowych na lokalnej maszynie Windows.
$logNames = 'Security','Application','System','Windows PowerShell','Microsoft-Windows-Store/Operational'$logEntries = $logNames | ForEach-Object -Parallel { Get-WinEvent -LogName $_ -MaxEvents 10000} -ThrottleLimit 5$logEntries.Count50000
Parametr Parallel określa blok skryptu, który jest uruchamiany równolegle dla każdej nazwy dziennika wejściowego. Parametr ThrottleLimit zapewnia, że wszystkie pięć bloków skryptów zostanie uruchomionych w tym samym czasie.
Przykład 13: Uruchom równolegle jako zadanie
Ten przykład uruchamia prosty blok skryptu równolegle, tworząc jednocześnie dwa zadania w tle.
$job = 1..10 | ForEach-Object -Parallel { "Output: $_" Start-Sleep 1} -ThrottleLimit 2 -AsJob$job | Receive-Job -WaitOutput: 1Output: 2Output: 3Output: 4Output: 5Output: 6Output: 7Output: 8Output: 9Output: 10
Zmienna $job
otrzymuje obiekt zadania, który zbiera dane wyjściowe i monitoruje stan pracy. Obiekt zadania jest przesyłany do Receive-Job
z parametrem przełącznika Wait. W ten sposób dane wyjściowe są przesyłane do konsoli, tak jak gdyby ForEach-Object -Parallel
został uruchomiony bez AsJob.
Przykład 14: Użycie bezpiecznych dla wątków referencji zmiennych
Ten przykład wywołuje równolegle bloki skryptów w celu zebrania unikalnie nazwanych obiektów Process.
$threadSafeDictionary = ]::new()Get-Process | ForEach-Object -Parallel { $dict = $using:threadSafeDictionary $dict.TryAdd($_.ProcessName, $_)}$threadSafeDictionaryNPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName ------ ----- ----- ------ -- -- ----------- 82 82.87 130.85 15.55 2808 2 pwsh
Pojedyncza instancja obiektu ConcurrentDictionary jest przekazywana do każdego bloku skryptu w celu zebrania obiektów. Ponieważ ConcurrentDictionary jest bezpieczny dla wątków, może być bezpiecznie modyfikowany przez każdy z równoległych skryptów. Obiekt, który nie jest bezpieczny dla wątków, taki jak System.Collections.Generic.Dictionary, nie byłby bezpieczny do użycia w tym miejscu.
Uwaga
Przykład ten jest bardzo nieefektywnym użyciem parametru Parallel. Skrypt po prostu dodaje obiekt inputobject do współbieżnego obiektu słownika. Jest to trywialne i nie warte narzutu wywoływania każdego skryptu w osobnym wątku. Uruchomienie ForEach-Object
normalnie bez Parallelswitcha jest znacznie wydajniejsze i szybsze. Ten przykład ma na celu jedynie zademonstrowanie jak używać zmiennych bezpiecznych dla wątku.
Przykład 15: Zapisywanie błędów z równoległym wykonywaniem
Ten przykład zapisuje równolegle do strumienia błędów, gdzie kolejność zapisywanych błędów jest losowa.
1..3 | ForEach-Object -Parallel { Write-Error "Error: $_"}Write-Error: Error: 1Write-Error: Error: 3Write-Error: Error: 2
Przykład 16: Kończenie błędów w wykonaniu równoległym
Przykład ten demonstruje błąd kończący w jednym równolegle działającym bloku skryptowym.
1..5 | ForEach-Object -Parallel { if ($_ -eq 3) { throw "Terminating Error: $_" } Write-Output "Output: $_"}Exception: Terminating Error: 3Output: 1Output: 4Output: 2Output: 5
Output: 3
nigdy nie jest zapisywany, ponieważ równoległy blok skryptowy dla tej iteracji został zakończony.
Przykład 17: Przekazywanie zmiennych w zagnieżdżonych równoległych skryptach ScriptBlockSet
Można utworzyć zmienną poza Foreach-Object -Parallel
scoped scriptblock i użyć jej wewnątrz scriptblock za pomocą słowa kluczowego $using
.
$test1 = 'TestA'1..2 | Foreach-Object -Parallel { $using:test1}TestATestA# You CANNOT create a variable inside a scoped scriptblock# to be used in a nested foreach parallel scriptblock.$test1 = 'TestA'1..2 | Foreach-Object -Parallel { $using:test1 $test2 = 'TestB' 1..2 | Foreach-Object -Parallel { $using:test2 }}Line | 2 | 1..2 | Foreach-Object -Parallel { | ~~~~~~~~~~~~~~~~~~~~~~~~~~ | The value of the using variable '$using:test2' cannot be retrieved because it has not been set in the local session.
Zagnieżdżony blok skryptowy nie może uzyskać dostępu do zmiennej $test2
i wyrzucany jest błąd.
Parametry
Podaje tablicę argumentów do wywołania metody. Aby uzyskać więcej informacji na temat zachowaniaArgumentList, zobacz about_Splatting.
Parametr ten został wprowadzony w Windows PowerShell 3.0.
Typ: | Obiekt |
Alias: | Args |
Pozycja: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Uruchamia równoległą inwokację do uruchomienia jako zadanie PowerShell. Pojedynczy obiekt zadania jest zwracany zamiast danych wyjściowych z uruchomionych bloków skryptu. Obiekt zadania zawiera zadania potomne dla każdego uruchomionego bloku skryptu równoległego. Obiekt zadania może być używany przez wszystkie cmdlety zadań PowerShell, do monitorowania stanu działania i pobierania danych.
Parametr ten został wprowadzony w PowerShell 7.0.
Typ: | SwitchParameter |
Pozycja: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Wskazuje blok skryptu, który jest uruchamiany zanim ten cmdlet przetworzy jakiekolwiek obiekty wejściowe. Ten blok skryptu jest uruchamiany tylko raz dla całego rurociągu. Aby uzyskać więcej informacji na temat bloku begin
zobacz temat_Funkcje.
Typ: | ScriptBlock |
Pozycja: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Prosi o potwierdzenie przed uruchomieniem cmdletu.
Typ: | SwitchParameter |
Alias: | cf |
Pozycja: | Named |
Default value: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Wskazuje blok skryptu, który zostanie uruchomiony po przetworzeniu przez ten cmdlet wszystkich obiektów wejściowych. Ten blok skryptu jest uruchamiany tylko raz dla całego rurociągu. Aby uzyskać więcej informacji na temat bloku end
zobacz temat_Funkcje.
Typ: | ScriptBlock |
Pozycja: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Określa obiekty wejściowe. ForEach-Object
Uruchamia blok skryptu lub instrukcję obsługi na każdym obiekcie wejściowym. Podaj zmienną, która zawiera obiekty, lub wpisz polecenie lub wyrażenie, które pobiera te obiekty.
Gdy używasz parametru InputObject z ForEach-Object
, zamiast przekazywać wyniki polecenia do ForEach-Object
, wartość InputObject jest traktowana jako pojedynczy obiekt. Dzieje się tak nawet wtedy, gdy wartość jest kolekcją, która jest wynikiem polecenia, takiego jak -InputObject (Get-Process)
.Ponieważ InputObject nie może zwracać poszczególnych właściwości z tablicy lub kolekcji obiektów, zalecamy, aby w przypadku użycia ForEach-Object
do wykonania operacji na kolekcji obiektów, które mają określone wartości w zdefiniowanych właściwościach, użyć ForEach-Object
w linii postępowania, jak pokazano w przykładach w tym temacie.
Typ: | PSObject |
Pozycja: | Named |
Default value: | None |
Accept pipeline input: | True |
Accept wildcard characters: | False |
Wskazuje właściwość, którą należy uzyskać lub metodę, którą należy wywołać.
Znaki wieloznaczne są dozwolone, ale działają tylko wtedy, gdy wynikowy ciąg znaków rozwiąże się do unikalnej wartości.
Na przykład, jeśli uruchomisz Get-Process | ForEach -MemberName *Name
, wzorzec wieloznaczny dopasuje więcej niż jednego członka, powodując niepowodzenie polecenia.
Ten parametr został wprowadzony w Windows PowerShell 3.0.
Type: | String |
Position: | 0 |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | True |
Wskazuje blok skryptu, który ma być użyty do równoległego przetwarzania obiektów wejściowych. Należy podać blok skryptu opisujący operację.
Parallel – parametr wprowadzony w PowerShell 7.0.
Typ: | ScriptBlock |
Pozycja: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Określa operację, która jest wykonywana na każdym obiekcie wejściowym. Ten blok skryptu jest uruchamiany dla każdego obiektu w rurociągu. Więcej informacji na temat bloku process
można znaleźć w punkcieabout_Functions.
Gdy do parametru Process podajemy wiele bloków skryptów, pierwszy blok skryptu jest zawsze mapowany do bloku begin
. Jeżeli są tylko dwa bloki skryptów, to drugi blok jest mapowany do bloku process
. Jeśli są trzy lub więcej bloków skryptów, pierwszy blok skryptu jest zawsze mapowany do bloku begin
, ostatni blok jest mapowany do bloku end
, a bloki pomiędzy nimi są mapowane do bloku process
.
Typ: | ScriptBlock |
Pozycja: | 0 |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Określa wszystkie bloki skryptów, które nie są zajęte przez parametr Process.
Parametr ten został wprowadzony w Windows PowerShell 3.0.
Type: | ScriptBlock |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Określa liczbę bloków skryptu, które równolegle. Obiekty wejściowe są blokowane, dopóki liczba działających bloków skryptów nie spadnie poniżej ThrottleLimit. Wartość domyślna to 5
.
Ten parametr został wprowadzony w PowerShell 7.0.
Type: | Int32 |
Position: | Named |
Default value: | 5 |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Określa liczbę sekund oczekiwania na równoległe przetworzenie wszystkich danych wejściowych. Po upływie określonego czasu oczekiwania, wszystkie uruchomione skrypty są zatrzymywane. Wszystkie pozostałe do przetworzenia obiekty wejściowe są ignorowane. Domyślna wartość 0
wyłącza timeout, a ForEach-Object -Parallel
może działać w nieskończoność. Wpisanie Ctrl+C w linii poleceń zatrzymuje działające polecenieForEach-Object -Parallel
. Parametr ten nie może być używany razem z parametrem AsJob.
Parametr ten został wprowadzony w PowerShell 7.0.
Type: | Int32 |
Position: | Named |
Default value: | 0 |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Pokazuje, co by się stało, gdyby cmdlet został uruchomiony. Polecenie nie zostanie uruchomione.
Typ: | SwitchParameter |
Aliases: | wi |
Pozycja: | Named |
Default value: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Inputs
PSObject
Do tego cmdleta można podać dowolny obiekt.
Wejścia
PSObject
Ten cmdlet zwraca obiekty, które są określone przez dane wejściowe.
Przypisy
-
Ccmdlet
ForEach-Object
działa podobnie jak instrukcja Foreach, z wyjątkiem tego, że nie można przesyłać danych wejściowych do instrukcji Foreach. Aby uzyskać więcej informacji na temat instrukcji Foreach, zobaczabout_Foreach. -
Począwszy od wersji 4.0 PowerShell, dodano metody
Where
iForEach
do użycia z kolekcjami. Możesz przeczytać więcej o tych nowych metodach tutaj about_arrays -
Zestaw parametrów
ForEach-Object -Parallel
używa wewnętrznego API PowerShella do uruchomienia każdego bloku skryptu. Jest to znacznie większy narzut niż uruchamianieForEach-Object
normalnie z sequentialprocessing. Ważne jest, aby używać Parallel, gdy narzut działania równoległego jest niewielki w porównaniu do pracy wykonywanej przez blok skryptu. Na przykład:- Skrypty intensywnie przetwarzające dane na maszynach wielordzeniowych
- Skrypty, które spędzają czas na oczekiwaniu na wyniki lub wykonują operacje na plikach
Użycie parametru Parallel może spowodować, że skrypty będą działać znacznie wolniej niż normalnie. Zwłaszcza jeśli skrypty równoległe są trywialne. Poeksperymentuj z Parallel aby odkryć gdzie może być korzystne.
Ważne
Zestaw parametrów
ForEach-Object -Parallel
uruchamia bloki skryptów równolegle na oddzielnych wątkach procesowych. Słowo kluczowe$using:
umożliwia przekazywanie referencji do zmiennych z wątku wywołującego cmdlet do każdego uruchomionego wątku bloku skryptu. Ponieważ bloki skryptów są uruchamiane w różnych wątkach, zmienne obiektowe przekazywane przez referencję muszą być używane w bezpieczny sposób. Na ogół bezpiecznie jest czytać z obiektów, do których się odwołujemy, a które się nie zmieniają. Jeżeli jednak stan obiektu jest modyfikowany, to należy używać obiektów bezpiecznych dla wątków, takich jak typy .Net System.Collection.Concurrent (patrz Przykład 11).
- Compare-Object
- Where-Object
- Group-Object
- Measure-Object
- New-Object
- Select-Object
- Sort-Object
- Tee-Object