ForEach-Object
Voert een bewerking uit op elk item in een verzameling invoerobjecten.
Syntaxis
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
De cmdlet ForEach-Object voert een bewerking uit op elk item in een verzameling invoerobjecten. De invoerobjecten kunnen worden doorgesluisd naar de cmdlet of worden opgegeven met behulp van de parameter InputObject.
Vanaf Windows PowerShell 3.0 zijn er twee verschillende manieren om een opdracht ForEach-Object te maken.
scriptblok. U kunt een scriptblok gebruiken om de bewerking op te geven. Gebruik in het scriptblok de
$_
variabele om het huidige object weer te geven. Het scriptblok is de waarde van de parameter Process. Het scriptblok kan elk PowerShell-script bevatten.Met de volgende opdracht wordt bijvoorbeeld de waarde opgehaald van de eigenschap ProcessName van elk proces op de computer.
Get-Process | ForEach-Object {$_.ProcessName}
Operation-instructie. U kunt ook een bewerkingsinstructie schrijven, wat veel meer lijkt op natuurlijke taal. U kunt de bewerkingsinstructie gebruiken om een eigenschapswaarde op te geven of een methode aan te roepen. Bewerkingsinstructies zijn geïntroduceerd in Windows PowerShell 3.0.
Met de volgende opdracht wordt bijvoorbeeld ook de waarde opgehaald van de eigenschap ProcessName van elk proces op de computer.
Get-Process | ForEach-Object ProcessName
Wanneer u de scriptblokindeling gebruikt, kunt u naast het scriptblok ook de bewerkingen beschrijven die op elk invoerobject worden uitgevoerd, twee extra scriptblokken opgeven. Het scriptblok Begin, de waarde van de parameter Begin, wordt uitgevoerd voordat deze cmdlet het eerste invoerobject verwerkt. Het eindscriptblok, de waarde van de parameter End, wordt uitgevoerd nadat deze cmdlet het laatste invoerobject verwerkt.
Voorbeelden
Voorbeeld 1: Gehele getallen in een matrix delen
30000, 56798, 12432 | ForEach-Object -Process {$_/1024}
29.296875
55.466796875
12.140625
Met deze opdracht wordt een matrix van drie gehele getallen gebruikt en worden ze allemaal gedeeld door 1024.
Voorbeeld 2: de lengte van alle bestanden in een map ophalen
Get-ChildItem $pshome | ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}
Met deze opdracht worden de bestanden en mappen in de PowerShell-installatiemap $pshome
en doorgegeven aan de ForEach-Object
cmdlet.
Als het object geen map is, krijgt het scriptblok de naam van het bestand, deelt u de waarde van de eigenschap Length door 1024 en voegt u een spatie (" ") toe om deze te scheiden van het volgende item.
De cmdlet gebruikt de eigenschap PSISContainer om te bepalen of een object een map is.
Voorbeeld 3: Werken op de meest recente systeem gebeurtenissen
$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}
Met deze opdracht worden de 1000 meest recente gebeurtenissen opgehaald uit het gebeurtenislogboek van het systeem en worden deze opgeslagen in de $Events
variabele.
Vervolgens worden de gebeurtenissen door de ForEach-Object
cmdlet.
De parameter Begin geeft de huidige datum en tijd weer.
Vervolgens gebruikt de parameter Process de cmdlet Out-File
om een tekstbestand met de naam events.txt te maken en de berichteigenschap van elk van de gebeurtenissen in dat bestand op te slaan.
Ten slotte wordt de parameter End gebruikt om de datum en tijd weer te geven nadat alle verwerking is voltooid.
Voorbeeld 4: De waarde van een registersleutel wijzigen
Get-ItemProperty -Path HKCU:\Network\* | ForEach-Object {Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper();}
Met deze opdracht wijzigt u de waarde van de RemotePath registervermelding in alle subsleutels onder de HKCU:\Network-sleutel in hoofdletters. U kunt deze indeling gebruiken om het formulier of de inhoud van een registervermeldingswaarde te wijzigen.
Elke subsleutel in de Network-sleutel vertegenwoordigt een toegewezen netwerkstation dat opnieuw verbinding maakt bij aanmelding. De vermelding RemotePath bevat het UNC-pad van het verbonden station. Als u bijvoorbeeld het station E: toe wijzen aan \\Server\Share, is er een E-subsleutel van HKCU:\Network en de waarde van de RemotePath registervermelding in de E-subsleutel is \\Server\Share.
De opdracht gebruikt de Get-ItemProperty
cmdlet om alle subsleutels van de Network-sleutel en de Set-ItemProperty
cmdlet op te halen om de waarde van de RemotePath registervermelding in elke sleutel te wijzigen.
In de opdracht Set-ItemProperty
is het pad de waarde van de eigenschap PSPath van de registersleutel.
Dit is een eigenschap van het Microsoft .NET Framework-object dat de registersleutel vertegenwoordigt, niet een registervermelding.
De opdracht maakt gebruik van de ToUpper() methode van de RemotePath--waarde, een tekenreeks (REG_SZ).
Omdat Set-ItemProperty
de eigenschap van elke sleutel wijzigt, is de ForEach-Object
cmdlet vereist voor toegang tot de eigenschap.
Voorbeeld 5: de automatische variabele $Null gebruiken
1, 2, $null, 4 | ForEach-Object {"Hello"}
Hello
Hello
Hello
Hello
In dit voorbeeld ziet u het effect van het doorsluisen van de automatische variabele $Null
naar de cmdlet ForEach-Object
.
Omdat PowerShell null als een expliciete tijdelijke aanduiding behandelt, genereert de ForEach-Object
-cmdlet een waarde voor $Null
, net zoals voor andere objecten die u ernaar sluist.
Zie about_Automatic_Variables voor meer informatie over de automatische variabele $Null
.
Voorbeeld 6: Eigenschapswaarden ophalen
Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path
Met deze opdrachten wordt de waarde opgehaald van de eigenschap Path van alle geïnstalleerde PowerShell-modules. Ze gebruiken de parameter MemberName om de eigenschap Path van modules op te geven.
De tweede opdracht is gelijk aan de eerste.
Hierbij wordt de Foreach- alias van de cmdlet ForEach-Object
gebruikt en wordt de naam van de parameter MemberName weggelaten. Dit is optioneel.
De ForEach-Object
cmdlet is erg handig voor het ophalen van eigenschapswaarden, omdat deze de waarde krijgt zonder het type te wijzigen, in tegenstelling tot de Format cmdlets of de Select-Object
cmdlet, waarmee het eigenschapswaardetype wordt gewijzigd.
Voorbeeld 7: Modulenamen splitsen in onderdeelnamen
"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
Met deze opdrachten worden twee door puntjes gescheiden modulenamen gesplitst in hun onderdeelnamen. Met de opdrachten wordt de methode Split tekenreeksen aangeroepen. De drie opdrachten gebruiken verschillende syntaxis, maar ze zijn gelijkwaardig en uitwisselbaar.
De eerste opdracht maakt gebruik van de traditionele syntaxis, die een scriptblok en de huidige objectoperator $_
bevat.
Hierbij wordt de syntaxis van de punt gebruikt om de methode en haakjes op te geven om het scheidingstekenargument in te sluiten.
De tweede opdracht gebruikt de parameter MemberName om de methode Split en de parameter ArgumentName op te geven om de punt (".") te identificeren als scheidingsteken.
De derde opdracht maakt gebruik van de cmdlet Foreach alias van de Foreach-Object cmdlet en laat de namen van de MemberName en ArgumentList parameters staan, die optioneel zijn.
De uitvoer van deze drie opdrachten, die hieronder wordt weergegeven, is identiek.
Split is slechts een van de vele nuttige methoden voor tekenreeksen.
Als u alle eigenschappen en methoden van tekenreeksen wilt zien, sluist u een tekenreeks door naar de cmdlet Get-Member
.
Parameters
-ArgumentList
Hiermee geeft u een matrix van argumenten voor een methodeaanroep.
Deze parameter is geïntroduceerd in Windows PowerShell 3.0.
Type: | Object[] |
Aliassen: | Args |
Position: | Named |
Default value: | None |
Vereist: | False |
Pijplijninvoer accepteren: | False |
Jokertekens accepteren: | False |
-Begin
Hiermee geeft u een scriptblok op dat wordt uitgevoerd voordat deze cmdlet invoerobjecten verwerkt.
Type: | ScriptBlock |
Position: | Named |
Default value: | None |
Vereist: | False |
Pijplijninvoer accepteren: | False |
Jokertekens accepteren: | False |
-Confirm
U wordt gevraagd om bevestiging voordat u de cmdlet uitvoert.
Type: | SwitchParameter |
Aliassen: | cf |
Position: | Named |
Default value: | False |
Vereist: | False |
Pijplijninvoer accepteren: | False |
Jokertekens accepteren: | False |
-End
Hiermee geeft u een scriptblok op dat wordt uitgevoerd nadat deze cmdlet alle invoerobjecten verwerkt.
Type: | ScriptBlock |
Position: | Named |
Default value: | None |
Vereist: | False |
Pijplijninvoer accepteren: | False |
Jokertekens accepteren: | False |
-InputObject
Hiermee geeft u de invoerobjecten.
ForEach-Object
voert het scriptblok of de bewerkingsinstructie uit op elk invoerobject.
Voer een variabele in die de objecten bevat of typ een opdracht of expressie waarmee de objecten worden opgehaald.
Wanneer u de parameter -InputObject (Get-Process)
.
Omdat InputObject geen afzonderlijke eigenschappen kan retourneren uit een matrix of verzameling objecten, raden we u ForEach-Object
aan om bewerkingen uit te voeren op een verzameling objecten voor objecten met specifieke waarden in gedefinieerde eigenschappen, gebruikt u ForEach-Object
in de pijplijn, zoals wordt weergegeven in de voorbeelden in dit onderwerp.
Type: | PSObject |
Position: | Named |
Default value: | None |
Vereist: | False |
Pijplijninvoer accepteren: | True |
Jokertekens accepteren: | False |
-MemberName
Hiermee geeft u de eigenschap op die moet worden get of de methode die moet worden aangeroepen.
Jokertekens zijn toegestaan, maar werken alleen als de resulterende tekenreeks wordt omgezet in een unieke waarde.
Als u bijvoorbeeld Get-Process | ForEach -MemberName *Name
uitvoert en er meer dan één lid bestaat met een naam die de tekenreeksnaam bevat, zoals de eigenschappen ProcessName en Name, mislukt de opdracht.
Deze parameter is geïntroduceerd in Windows PowerShell 3.0.
Type: | String |
Position: | 0 |
Default value: | None |
Vereist: | True |
Pijplijninvoer accepteren: | False |
Jokertekens accepteren: | True |
-Process
Hiermee geeft u de bewerking die wordt uitgevoerd op elk invoerobject. Voer een scriptblok in waarmee de bewerking wordt beschreven.
Type: | ScriptBlock[] |
Position: | 0 |
Default value: | None |
Vereist: | True |
Pijplijninvoer accepteren: | False |
Jokertekens accepteren: | False |
-RemainingScripts
Hiermee geeft u alle scriptblokken op die niet worden gebruikt door de parameter Process.
Deze parameter is geïntroduceerd in Windows PowerShell 3.0.
Type: | ScriptBlock[] |
Position: | Named |
Default value: | None |
Vereist: | False |
Pijplijninvoer accepteren: | False |
Jokertekens accepteren: | False |
-WhatIf
Toont wat er zou gebeuren als de cmdlet wordt uitgevoerd. De cmdlet wordt niet uitgevoerd.
Type: | SwitchParameter |
Aliassen: | wi |
Position: | Named |
Default value: | False |
Vereist: | False |
Pijplijninvoer accepteren: | False |
Jokertekens accepteren: | False |
Invoerwaarden
U kunt elk object doorsluisen naar deze cmdlet.
Uitvoerwaarden
Met deze cmdlet worden objecten geretourneerd die worden bepaald door de invoer.
Notities
- De
ForEach-Object
-cmdlet werkt vergelijkbaar met de instructie Foreach, behalve dat u geen invoer kunt doorsluisen naar een Foreach--instructie. Zie about_Foreachvoor meer informatie over de instructie Foreach. - Vanaf PowerShell 4.0 zijn
Where
enForEach
methoden toegevoegd voor gebruik met verzamelingen. - Meer informatie over deze nieuwe methoden vindt u hier about_arrays