Delen via


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 InputObject parameter.

Vanaf Windows PowerShell 3.0 zijn er twee verschillende manieren om een ForEach-Object opdracht 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}

    ForEach-Object ondersteunt de blokken begin, processen end, zoals beschreven in about_functions.

    Notitie

    De scriptblokken worden uitgevoerd in het bereik van de aanroeper. De blokken hebben daarom toegang tot variabelen in dat bereik en kunnen nieuwe variabelen maken die in dat bereik blijven bestaan nadat de cmdlet is voltooid.

  • 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

Voorbeelden

Voorbeeld 1: Gehele getallen in een matrix delen

In dit voorbeeld wordt een matrix van drie gehele getallen gebruikt en worden ze allemaal gedeeld door 1024.

30000, 56798, 12432 | ForEach-Object -Process {$_/1024}

29.296875
55.466796875
12.140625

Voorbeeld 2: de lengte van alle bestanden in een map ophalen

In dit voorbeeld worden de bestanden en mappen in de PowerShell-installatiemap $PSHOMEverwerkt.

Get-ChildItem $PSHOME |
  ForEach-Object -Process {if (!$_.PSIsContainer) {$_.Name; $_.Length / 1024; " " }}

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 de volgende vermelding. De cmdlet gebruikt de eigenschap PSISContainer om te bepalen of een object een map is.

Voorbeeld 3: Werken op de meest recente systeem gebeurtenissen

In dit voorbeeld worden de 1000 meest recente gebeurtenissen uit het gebeurtenislogboek van het systeem naar een tekstbestand geschreven. De huidige tijd wordt weergegeven voor en na het verwerken van de gebeurtenissen.

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 haalt de 1000 meest recente gebeurtenissen op uit het gebeurtenislogboek van het systeem en pijpt deze door naar 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

In dit voorbeeld wordt de waarde van de registervermelding RemotePath gewijzigd in alle subsleutels onder de HKCU:\Network sleutel in hoofdletters.

Get-ItemProperty -Path HKCU:\Network\* |
  ForEach-Object {
    Set-ItemProperty -Path $_.PSPath -Name RemotePath -Value $_.RemotePath.ToUpper()
  }

U kunt deze indeling gebruiken om het formulier of de inhoud van een registervermeldingswaarde te wijzigen.

Elke subsleutel in de sleutel Network 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 E: station toe wijst aan \\Server\Share, wordt er een E-subsleutel gemaakt in HKCU:\Network met de registerwaarde RemotePath ingesteld op \\Server\Share.

De opdracht gebruikt de cmdlet Get-ItemProperty 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

In dit voorbeeld ziet u het effect van het doorsluisen van de automatische variabele $null naar de cmdlet ForEach-Object.

1, 2, $null, 4 | ForEach-Object {"Hello"}

Hello
Hello
Hello
Hello

Omdat PowerShell $null als een expliciete tijdelijke aanduiding behandelt, genereert de ForEach-Object-cmdlet een waarde voor $null, net als voor andere objecten die eraan worden doorgesluisd.

Voorbeeld 6: Eigenschapswaarden ophalen

In dit voorbeeld wordt de waarde opgehaald van de eigenschap Path van alle geïnstalleerde PowerShell-modules met behulp van de parameter MemberName van de cmdlet ForEach-Object.

Get-Module -ListAvailable | ForEach-Object -MemberName Path
Get-Module -ListAvailable | Foreach Path

De tweede opdracht is gelijk aan de eerste. Hierbij wordt de Foreach alias van de ForEach-Object-cmdlet gebruikt en wordt de naam van de parameter MemberName weggelaten. Dit is optioneel.

De ForEach-Object cmdlet is 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

In dit voorbeeld ziet u drie manieren om twee door puntjes gescheiden modulenamen te splitsen 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 uitvoer is hetzelfde voor alle drie de gevallen.

"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

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 ArgumentList op te geven om de punt (.) te identificeren als scheidingsteken.

De derde opdracht maakt gebruik van de Foreach alias van de ForEach-Object cmdlet en laat de namen van de parameters MemberName en ArgumentList, die optioneel zijn, weg.

Voorbeeld 8: ForEach-Object gebruiken met twee scriptblokken

In dit voorbeeld geven we twee scriptblokken positioneel door. Alle scriptblokken binden aan de parameter Process. Ze worden echter behandeld alsof ze zijn doorgegeven aan de parameters Begin en Proces.

1..2 | ForEach-Object { 'begin' } { 'process' }

begin
process
process

Voorbeeld 9: ForEach-Object gebruiken met meer dan twee scriptblokken

In dit voorbeeld geven we vier scriptblokken positioneel door. Alle scriptblokken binden aan de parameter Process. Ze worden echter behandeld alsof ze zijn doorgegeven aan de Begin, Procesen Parameters beëindigen.

1..2 | ForEach-Object { 'begin' } { 'process A' }  { 'process B' }  { 'end' }

begin
process A
process B
process A
process B
end

Notitie

Het eerste scriptblok wordt altijd toegewezen aan het begin blok, het laatste blok wordt toegewezen aan het end blok en de twee middelste blokken worden toegewezen aan het process blok.

Voorbeeld 10: Meerdere scriptblokken uitvoeren voor elk pijplijnitem

Zoals wordt weergegeven in het vorige voorbeeld, worden meerdere scriptblokken die zijn doorgegeven met behulp van de parameter Process toegewezen aan de parameters Begin en End. Als u deze toewijzing wilt voorkomen, moet u expliciete waarden opgeven voor de parameters Begin en End.

1..2 | ForEach-Object -Begin $null -Process { 'one' }, { 'two' }, { 'three' } -End $null

one
two
three
one
two
three

Parameters

-ArgumentList

Hiermee geeft u een matrix van argumenten voor een methodeaanroep. Zie about_Splattingvoor meer informatie over het gedrag van ArgumentList.

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. Dit scriptblok wordt slechts eenmaal uitgevoerd voor de hele pijplijn. Zie about_Functionsvoor meer informatie over het begin blok.

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. Dit scriptblok wordt slechts eenmaal uitgevoerd voor de hele pijplijn. Zie about_Functionsvoor meer informatie over het end blok.

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 gebruikt met ForEach-Object, wordt de InputObject waarde beschouwd als één object in plaats van de opdrachtresultaten om te ForEach-Object. Dit geldt zelfs als de waarde een verzameling is die het resultaat is van een opdracht, zoals -InputObject (Get-Process). Omdat InputObject geen afzonderlijke eigenschappen kan retourneren uit een matrix of verzameling objecten, ForEach-Object raden we u 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 naam van de lideigenschap op om op te halen of de lidmethode die moet worden aangeroepen. De leden moeten exemplaarleden zijn, niet statische leden.

Jokertekens zijn toegestaan, maar werken alleen als de resulterende tekenreeks wordt omgezet in een unieke waarde. Als u bijvoorbeeld Get-Process | ForEach -MemberName *Nameuitvoert, komt het jokertekenpatroon overeen met meer dan één lid waardoor de opdracht mislukt.

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. Dit scriptblok wordt uitgevoerd voor elk object in de pijplijn. Zie about_Functionsvoor meer informatie over het process blok.

Wanneer u meerdere scriptblokken opgeeft aan de parameter Process, wordt het eerste scriptblok altijd toegewezen aan het begin blok. Als er slechts twee scriptblokken zijn, wordt het tweede blok toegewezen aan het process blok. Als er drie of meer scriptblokken zijn, wordt het eerste scriptblok altijd toegewezen aan het begin blok, wordt het laatste blok toegewezen aan het end blok en worden de middelste blokken toegewezen aan het process blok.

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 genomen 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

PSObject

U kunt elk object doorsluisen naar deze cmdlet.

Uitvoerwaarden

PSObject

Met deze cmdlet worden objecten geretourneerd die worden bepaald door de invoer.

Notities

Windows PowerShell bevat de volgende aliassen voor ForEach-Object:

  • %
  • foreach

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 en ForEach methoden toegevoegd voor gebruik met verzamelingen. Meer informatie over deze nieuwe methoden vindt u hier about_arrays