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 konstruera 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 valfritt 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}
Åtgärdsuttryck. Du kan också skriva en åtgärdsinstruktur som är mycket mer likt naturligt språk. 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
När du använder skriptblockformatet kan du, förutom att använda skriptblocket som beskriver de åtgärder som utförs på varje indataobjekt, tillhandahålla ytterligare två skriptblock. Skriptblocket Begin, som är värdet för parametern Begin, körs innan den här cmdleten bearbetar det första indataobjektet. Blocket Slutskript, som är värdet för parametern End, körs efter att den här cmdleten bearbetar det sista indataobjektet.
Exempel
Exempel 1: Dela upp heltal i en matris
30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625
Det här kommandot tar en matris med tre heltal och delar var och en av dem med 1024.
Exempel 2: Hämta längden på alla filer i en katalog
Get-ChildItem $pshome | ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}
Det här kommandot hämtar filerna och katalogerna i PowerShell-installationskatalogen $pshome
och skickar dem till cmdleten ForEach-Object
.
Om objektet inte är en katalog hämtar skriptblocket namnet på filen, delar upp värdet för egenskapen Length med 1024 och lägger till ett blanksteg (" ") för att skilja 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
$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}
Det här kommandot hämtar de 1 000 senaste händelserna från systemhändelseloggen och lagrar dem i variabeln $Events
.
Sedan dirigeras händelserna till cmdleten ForEach-Object
.
Parametern Begin visar aktuellt datum och tid.
Parametern Process använder sedan 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
Get-ItemProperty -Path HKCU:\Network\* | ForEach-Object {Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper();}
Det här kommandot ändrar värdet för RemotePath- registerpost i alla undernycklar under HKCU:\Nätverksnyckeln till versaler. Du kan använda det här formatet för att ändra formuläret eller innehållet i ett registerpostvärde.
Varje undernyckel i nyckeln Network representerar en mappad nätverksenhet som ska återansluta vid inloggning. Posten RemotePath innehåller UNC-sökvägen för den anslutna enheten. Om du till exempel mappar E:-enheten till \\Server\Share, kommer det att finnas en E-undernyckel för HKCU:\Network och värdet för RemotePath- registerpost i E-undernyckeln blir \\Server\Share.
Kommandot använder cmdleten Get-ItemProperty
för att hämta alla undernycklar för Network-nyckeln och cmdleten Set-ItemProperty
för att ändra värdet för registerposten RemotePath i varje nyckel.
I kommandot Set-ItemProperty
är sökvägen värdet för egenskapen PSPath för registernyckeln.
Det här är en egenskap för Microsoft .NET Framework-objektet som representerar registernyckeln, inte en registerpost.
Kommandot använder metoden ToUpper() för värdet RemotePath, som är en sträng (REG_SZ).
Eftersom Set-ItemProperty
ändrar egenskapen för varje nyckel krävs ForEach-Object
cmdlet för att få åtkomst till egenskapen.
Exempel 5: Använd variabeln $Null automatisk
1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello
Det här exemplet visar effekten av att skicka $Null
automatisk variabel till cmdleten ForEach-Object
.
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 dirigerar till den.
Mer information om den $Null
automatiska variabeln finns i about_Automatic_Variables.
Exempel 6: Hämta egenskapsvärden
Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path
Dessa kommandon hämtar värdet för egenskapen Path för alla installerade PowerShell-moduler. De använder parametern MemberName för att ange egenskapen Path för moduler.
Det andra kommandot motsvarar det första.
Den använder Foreach alias 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 cmdletarna Format eller cmdleten Select-Object
, som ändrar egenskapsvärdetypen.
Exempel 7: Dela upp modulnamn i 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
Dessa kommandon delar upp två punktavgränsade modulnamn i sina komponentnamn. 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änsningsargumentet.
Det andra kommandot använder parametern MemberName för att ange metoden Split och parametern ArgumentName för att identifiera punkten (".") som avgränsare för delad.
Det tredje kommandot använder Foreach alias för cmdleten Foreach-Object och utelämnar namnen på parametrarna MemberName och ArgumentList, som är valfria.
Utdata från dessa tre kommandon, som visas nedan, är identiska.
Split är bara en av många användbara metoder för strängar.
Om du vill se alla egenskaper och metoder för strängar kan du skicka en sträng till cmdleten Get-Member
.
Parametrar
-ArgumentList
Anger en matris med argument till ett metodanrop.
Den här parametern introducerades i Windows PowerShell 3.0.
Typ: | Object[] |
Alias: | Args |
Position: | Named |
Standardvärde: | None |
Obligatorisk: | False |
Godkänn pipeline-indata: | False |
Godkänn jokertecken: | False |
-Begin
Anger ett skriptblock som körs innan den här cmdleten bearbetar indataobjekt.
Typ: | ScriptBlock |
Position: | Named |
Standardvärde: | None |
Obligatorisk: | False |
Godkänn pipeline-indata: | False |
Godkänn jokertecken: | False |
-Confirm
Uppmanar dig att bekräfta innan du kör cmdleten.
Typ: | SwitchParameter |
Alias: | cf |
Position: | Named |
Standardvärde: | False |
Obligatorisk: | False |
Godkänn pipeline-indata: | False |
Godkänn jokertecken: | False |
-End
Anger ett skriptblock som körs efter att den här cmdleten bearbetar alla indataobjekt.
Typ: | ScriptBlock |
Position: | Named |
Standardvärde: | None |
Obligatorisk: | False |
Godkänn pipeline-indata: | False |
Godkänn jokertecken: | 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 värdet InputObject 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 objekt som har specifika värden i definierade egenskaper, använder du ForEach-Object
i pipelinen, som du ser i exemplen i det här avsnittet.
Typ: | PSObject |
Position: | Named |
Standardvärde: | None |
Obligatorisk: | False |
Godkänn pipeline-indata: | True |
Godkänn jokertecken: | False |
-MemberName
Anger den egenskap som ska hämtas eller vilken metod som ska anropas.
Jokertecken tillåts, men fungerar bara om den resulterande strängen matchas till ett unikt värde.
Om du till exempel kör Get-Process | ForEach -MemberName *Name
och det finns fler än en medlem med ett namn som innehåller strängnamnet, till exempel ProcessName och Namn egenskaper, misslyckas kommandot.
Den här parametern introducerades i Windows PowerShell 3.0.
Typ: | String |
Position: | 0 |
Standardvärde: | None |
Obligatorisk: | True |
Godkänn pipeline-indata: | False |
Godkänn jokertecken: | True |
-Process
Anger den åtgärd som utförs på varje indataobjekt. Ange ett skriptblock som beskriver åtgärden.
Typ: | ScriptBlock[] |
Position: | 0 |
Standardvärde: | None |
Obligatorisk: | True |
Godkänn pipeline-indata: | False |
Godkänn jokertecken: | False |
-RemainingScripts
Anger alla skriptblock som inte tas av parametern Process.
Den här parametern introducerades i Windows PowerShell 3.0.
Typ: | ScriptBlock[] |
Position: | Named |
Standardvärde: | None |
Obligatorisk: | False |
Godkänn pipeline-indata: | False |
Godkänn jokertecken: | False |
-WhatIf
Visar vad som skulle hända om cmdleten körs. Cmdleten körs inte.
Typ: | SwitchParameter |
Alias: | wi |
Position: | Named |
Standardvärde: | False |
Obligatorisk: | False |
Godkänn pipeline-indata: | False |
Godkänn jokertecken: | 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 instruktionen Foreach, förutom att du inte kan skicka indata till en Foreach--instruktion. Mer information om instruktionen Foreach finns i about_Foreach. - Från och med PowerShell 4.0 lades
Where
ochForEach
metoder till för användning med samlingar. - Du kan läsa mer om dessa nya metoder här about_arrays