ForEach-Object
Utför en åtgärd mot varje objekt i en samling indataobjekt.
Syntax
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>]
Description
Cmdleten ForEach-Object
utför en åtgärd på varje objekt i en samling indataobjekt. Indataobjekten kan skickas till cmdleten eller anges med hjälp av parametern InputObject .
Från och med Windows PowerShell 3.0 finns det två olika sätt att skapa ett ForEach-Object
kommando.
Skriptblock. Du kan använda ett skriptblock för att ange åtgärden. Använd variabeln i skriptblocket
$_
för att representera det aktuella objektet. Skriptblocket är värdet för parametern Process . Skriptblocket kan innehålla alla PowerShell-skript.Följande kommando hämtar till exempel värdet för egenskapen ProcessName för varje process på datorn.
Get-Process | ForEach-Object {$_.ProcessName}
ForEach-Object
stöder blockenbegin
,process
ochend
enligt beskrivningen i about_functions.Anteckning
Skriptblocken körs i anroparens omfång. Därför har blocken åtkomst till variabler i det omfånget och kan skapa nya variabler som finns kvar i omfånget när cmdleten har slutförts.
Åtgärdsinstrukering. Du kan också skriva en åtgärdsinstrukering, som liknar det naturliga språket. Du kan använda åtgärdssatsen för att ange ett egenskapsvärde eller anropa en metod. Åtgärdsinstruktioner introducerades i Windows PowerShell 3.0.
Följande kommando hämtar till exempel även värdet för egenskapen ProcessName för varje process på datorn.
Get-Process | ForEach-Object ProcessName
Exempel
Exempel 1: Dividera heltal i en matris
Det här exemplet tar en matris med tre heltal och delar var och en av dem med 1024.
30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625
Exempel 2: Hämta längden på alla filer i en katalog
Det här exemplet bearbetar filerna och katalogerna i PowerShell-installationskatalogen $PSHOME
.
Get-ChildItem $PSHOME |
ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}
Om objektet inte är en katalog hämtar skriptblocket namnet på filen, dividerar värdet för egenskapen Length med 1024 och lägger till ett blanksteg (" ") för att separera det från nästa post. Cmdleten använder egenskapen PSISContainer för att avgöra om ett objekt är en katalog.
Exempel 3: Arbeta med de senaste systemhändelserna
I det här exemplet skrivs de 1 000 senaste händelserna från systemhändelseloggen till en textfil. Den aktuella tiden visas före och efter bearbetning av händelserna.
$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
hämtar de 1 000 senaste händelserna från systemhändelseloggen och lagrar dem i variabeln $Events
. $Events
skickas sedan till cmdleten ForEach-Object
. Parametern Begin visar aktuellt datum och tid. Sedan använder parametern Process cmdleten Out-File
för att skapa en textfil med namnet events.txt och lagrar meddelandeegenskapen för var och en av händelserna i filen. Slutligen används parametern End för att visa datum och tid när all bearbetning har slutförts.
Exempel 4: Ändra värdet för en registernyckel
I det här exemplet ändras värdet för RemotePath-registerposten i alla undernycklar under HKCU:\Network
nyckeln till versaler.
Get-ItemProperty -Path HKCU:\Network\* |
ForEach-Object {Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper();}
Du kan använda det här formatet för att ändra formuläret eller innehållet i ett registerpostvärde.
Varje undernyckel i nätverksnyckeln representerar en mappad nätverksenhet som ska återansluta vid inloggning.
RemotePath-posten innehåller UNC-sökvägen för den anslutna enheten. Om du till exempel mappar enheten E: till \\Server\Share
kommer det att finnas en E-undernyckelHKCU:\Network
till och värdet för RemotePath-registerposten i E-undernyckeln är \\Server\Share
.
Kommandot använder cmdleten Get-ItemProperty
för att hämta alla undernycklar för nätverksnyckeln och cmdleten Set-ItemProperty
för att ändra värdet för RemotePath-registerposten i varje nyckel.
Set-ItemProperty
I kommandot är sökvägen värdet för egenskapen PSPath för registernyckeln. Det här är en egenskap för Objektet Microsoft .NET Framework som representerar registernyckeln, inte en registerpost. Kommandot använder metoden ToUpper() för RemotePath-värdet , som är en sträng (REG_SZ).
Eftersom Set-ItemProperty
ändrar egenskapen för varje nyckel krävs cmdleten ForEach-Object
för att få åtkomst till egenskapen.
Exempel 5: Använd den $Null automatiska variabeln
Det här exemplet visar effekten av att skicka den $Null
automatiska variabeln till cmdleten ForEach-Object
.
1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello
Eftersom PowerShell behandlar null som en explicit platshållare genererar cmdleten ForEach-Object
ett värde för $Null
, precis som för andra objekt som du skickar till den.
Exempel 6: Hämta egenskapsvärden
Det här exemplet hämtar värdet för egenskapen Path för alla installerade PowerShell-moduler med hjälp av parametern MemberName för cmdleten ForEach-Object
.
Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path
Det andra kommandot motsvarar det första. Den använder aliaset Foreach
för cmdleten ForEach-Object
och utelämnar namnet på parametern MemberName , vilket är valfritt.
Cmdleten ForEach-Object
är mycket användbar för att hämta egenskapsvärden, eftersom den hämtar värdet utan att ändra typen, till skillnad från format-cmdletar eller cmdlet, Select-Object
som ändrar egenskapsvärdetypen.
Exempel 7: Dela upp modulnamn i komponentnamn
I de här exemplen visas tre sätt att dela upp två punktavgränsade modulnamn i sina komponentnamn.
"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
Kommandona anropar metoden Split för strängar. De tre kommandona använder olika syntax, men de är likvärdiga och utbytbara.
Det första kommandot använder den traditionella syntaxen, som innehåller ett skriptblock och den aktuella objektoperatorn $_
. Den använder punktsyntaxen för att ange metoden och parenteserna för att omsluta avgränsarargumentet.
Det andra kommandot använder parametern MemberName för att ange metoden Split och parametern ArgumentName för att identifiera punkten (".") som avgränsare.
Det tredje kommandot använder Foreach-aliaset för cmdleten ForEach-Object
och utelämnar namnen på parametrarna MemberName och ArgumentList , som är valfria.
Exempel 8: Använda ForEach-Object med två skriptblock
I det här exemplet skickar vi två skriptblock positionligt. Alla skriptblock binder till parametern Process . De behandlas dock som om de hade skickats till parametrarna Begin och Process .
1..2 | ForEach-Object { 'begin' } { 'process' }
begin
process
process
Exempel 9: Använda ForEach-Object med fler än två skriptblock
I det här exemplet skickar vi två skriptblock positionligt. Alla skriptblock binder till parametern Process . De behandlas dock som om de hade skickats till parametrarna Begin, Process och End .
1..2 | ForEach-Object { 'begin' } { 'process A' } { 'process B' } { 'end' }
begin
process A
process B
process A
process B
end
Anteckning
Det första skriptblocket begin
mappas alltid till blocket, det sista blocket mappas till end
blocket och blocken däremellan mappas till process
blocket.
Exempel 10: Kör flera skriptblock för varje pipelineobjekt
Som du ser i föregående exempel mappas flera skriptblock som skickas med hjälp av processparametern till parametrarna Begin och End . För att undvika den här mappningen måste du ange explicita värden för parametrarna Begin och End .
1..2 | ForEach-Object -Begin $null -Process { 'one' }, { 'two' }, { 'three' } -End $null
one
two
three
one
two
three
Parametrar
-ArgumentList
Anger en matris med argument till ett metodanrop. Mer information om beteendet för ArgumentList finns i about_Splatting.
Den här parametern introducerades i Windows PowerShell 3.0.
Type: | Object[] |
Aliases: | Args |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Begin
Anger ett skriptblock som körs innan den här cmdleten bearbetar indataobjekt. Det här skriptblocket körs bara en gång för hela pipelinen. Mer information om blocket finns i begin
about_Functions.
Type: | ScriptBlock |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-Confirm
Uppmanar dig att bekräfta innan du kör cmdleten.
Type: | SwitchParameter |
Aliases: | cf |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-End
Anger ett skriptblock som körs efter att denna cmdlet bearbetar alla indataobjekt. Det här skriptblocket körs bara en gång för hela pipelinen. Mer information om blocket finns i end
about_Functions.
Type: | ScriptBlock |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-InputObject
Anger indataobjekten. ForEach-Object
kör skriptblocket eller åtgärdssatsen för varje indataobjekt. Ange en variabel som innehåller objekten eller skriv ett kommando eller uttryck som hämtar objekten.
När du använder parametern InputObject med ForEach-Object
, i stället för att skicka kommandoresultat till ForEach-Object
, behandlas InputObject-värdet som ett enda objekt. Detta gäller även om värdet är en samling som är resultatet av ett kommando, till exempel -InputObject (Get-Process)
.
Eftersom InputObject inte kan returnera enskilda egenskaper från en matris eller samling objekt rekommenderar vi att om du använder ForEach-Object
för att utföra åtgärder på en samling objekt för de objekt som har specifika värden i definierade egenskaper, använder ForEach-Object
du i pipelinen, som du ser i exemplen i det här avsnittet.
Type: | PSObject |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | True |
Accept wildcard characters: | False |
-MemberName
Anger egenskapen som ska hämtas eller vilken metod som ska anropas.
Jokertecken tillåts, men fungerar bara om den resulterande strängen matchar ett unikt värde.
Om du till exempel kör Get-Process | ForEach -MemberName *Name
, och fler än en medlem finns med ett namn som innehåller strängnamnet, till exempel egenskaperna ProcessName och Namn , misslyckas kommandot.
Den här parametern introducerades i Windows PowerShell 3.0.
Type: | String |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | True |
-Process
Anger den åtgärd som utförs på varje indataobjekt. Det här skriptblocket körs för varje objekt i pipelinen. Mer information om blocket finns i process
about_Functions.
När du anger flera skriptblock till parametern Process mappas alltid det första skriptblocket begin
till blocket. Om det bara finns två skriptblock mappas det andra blocket till process
blocket. Om det finns tre eller flera skriptblock mappas alltid det första skriptblocket begin
till blocket, det sista blocket mappas till end
blocket och blocken däremellan mappas till process
blocket.
Type: | ScriptBlock[] |
Position: | 0 |
Default value: | None |
Required: | True |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-RemainingScripts
Anger alla skriptblock som inte tas av parametern Process .
Den här parametern introducerades i Windows PowerShell 3.0.
Type: | ScriptBlock[] |
Position: | Named |
Default value: | None |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
-WhatIf
Visar vad som skulle hända om cmdleten kördes. Cmdleten körs inte.
Type: | SwitchParameter |
Aliases: | wi |
Position: | Named |
Default value: | False |
Required: | False |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Indata
Du kan skicka valfritt objekt till den här cmdleten.
Utdata
Den här cmdleten returnerar objekt som bestäms av indata.
Kommentarer
Cmdleten
ForEach-Object
fungerar ungefär som Foreach-instruktionen , förutom att du inte kan skicka indata till en Foreach-instruktion . Mer information om Foreach-instruktionen finns i about_Foreach.Från och med PowerShell 4.0
Where
ForEach
har metoder lagts till för användning med samlingar. Du kan läsa mer om dessa nya metoder här about_arrays