Freigeben über


ForEach-Object

Führt einen Vorgang für jedes Element in einer Auflistung von Eingabeobjekten aus.

Syntax

ScriptBlockSet (Standard)

ForEach-Object
    [-Process] <ScriptBlock[]>
    [-InputObject <PSObject>]
    [-Begin <ScriptBlock>]
    [-End <ScriptBlock>]
    [-RemainingScripts <ScriptBlock[]>]
    [-WhatIf]
    [-Confirm]
    [<CommonParameters>]

PropertyAndMethodSet

ForEach-Object
    [-MemberName] <String>
    [-InputObject <PSObject>]
    [-ArgumentList <Object[]>]
    [-WhatIf]
    [-Confirm]
    [<CommonParameters>]

Beschreibung

Das Cmdlet ForEach-Object führt einen Vorgang für jedes Element in einer Auflistung von Eingabeobjekten aus. Die Eingabeobjekte können an das Cmdlet weitergeleitet oder mithilfe des InputObject-Parameters angegeben werden.

Ab Windows PowerShell 3.0 gibt es zwei verschiedene Möglichkeiten, einen ForEach-Object-Befehl zu erstellen.

  • Skript-Block. Sie können einen Skriptblock verwenden, um den Vorgang anzugeben. Verwenden Sie im Skriptblock die $_ Variable, um das aktuelle Objekt darzustellen. Der Skriptblock ist der Wert des Process-Parameters . Der Skriptblock kann ein beliebiges PowerShell-Skript enthalten.

    Der folgende Befehl ruft beispielsweise den Wert der ProcessName-Eigenschaft jedes Prozesses auf dem Computer ab.

    Get-Process | ForEach-Object {$_.ProcessName}

  • Anweisung zur Operation. Sie können auch eine Operationsanweisung schreiben, die viel mehr natürlicher Sprache ähnelt. Sie können die operation-Anweisung verwenden, um einen Eigenschaftswert anzugeben oder eine Methode aufzurufen. In Windows PowerShell 3.0 wurden Vorgangsanweisungen eingeführt.

    Der folgende Befehl ruft beispielsweise auch den Wert der ProcessName-Eigenschaft jedes Prozesses auf dem Computer ab.

    Get-Process | ForEach-Object ProcessName

    Wenn Sie das Skriptblockformat verwenden, können Sie zusätzlich zu dem Skriptblock, der die Vorgänge beschreibt, die für jedes Eingabeobjekt ausgeführt werden, zwei zusätzliche Skriptblöcke bereitstellen. Der Begin-Skriptblock, bei dem es sich um den Wert des Begin-Parameters handelt, wird ausgeführt, bevor dieses Cmdlet das erste Eingabeobjekt verarbeitet. Der End-Skriptblock, bei dem es sich um den Wert des End-Parameters handelt, wird ausgeführt, nachdem dieses Cmdlet das letzte Eingabeobjekt verarbeitet hat.

Beispiele

Beispiel 1: Dividieren ganzzahliger Zahlen in einem Array

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

Dieser Befehl nimmt ein Array von drei ganzen Zahlen und dividiert jede von ihnen durch 1024.

Beispiel 2: Abrufen der Länge aller Dateien in einem Verzeichnis

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

Mit diesem Befehl werden die Dateien und Verzeichnisse im PowerShell-Installationsverzeichnis $pshome abgerufen und an das ForEach-Object Cmdlet übergeben. Wenn es sich bei dem Objekt nicht um ein Verzeichnis handelt, ruft der Skriptblock den Namen der Datei ab, dividiert den Wert seiner Length-Eigenschaft durch 1024 und fügt ein Leerzeichen (" ") hinzu, um ihn vom nächsten Eintrag zu trennen. Das Cmdlet verwendet die PSISContainer--Eigenschaft, um zu bestimmen, ob ein Objekt ein Verzeichnis ist.

Beispiel 3: Arbeiten mit den neuesten Systemereignissen

$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}

Mit diesem Befehl werden die 1000 letzten Ereignisse aus dem Systemereignisprotokoll abgerufen und in der $Events Variablen gespeichert. Anschließend werden die Ereignisse über die Pipeline an das ForEach-Object Cmdlet übergeben.

Der Begin-Parameter zeigt das aktuelle Datum und die aktuelle Uhrzeit an. Als Nächstes erstellt der Parameter Process mit dem Out-File Cmdlet eine Textdatei mit dem Namen events.txt und speichert die Meldungseigenschaft jedes Ereignisses in dieser Datei. Zuletzt wird der Parameter End verwendet, um das Datum und die Uhrzeit anzuzeigen, nachdem die gesamte Verarbeitung abgeschlossen ist.

Beispiel 4: Ändern des Werts eines Registrierungsschlüssels

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

Mit diesem Befehl wird der Wert des RemotePath-Registrierungseintrags in allen Unterschlüsseln unter dem Schlüssel HKCU:\Network in Großbuchstaben geändert. Sie können dieses Format verwenden, um das Formular oder den Inhalt eines Registrierungseintragswerts zu ändern.

Jeder Unterschlüssel im Netzwerkschlüssel stellt ein zugeordnetes Netzlaufwerk dar, das bei der Anmeldung wieder verbunden wird. Der RemotePath-Eintrag enthält den UNC-Pfad des verbundenen Laufwerks. Wenn Sie z. B. das Laufwerk E: \\Server\Share zuordnen, gibt es einen E-Unterschlüssel von HKCU:\Network, und der Wert des RemotePath-Registrierungseintrags im E-Unterschlüssel lautet \\Server\Share.

Der Befehl verwendet das Get-ItemProperty Cmdlet, um alle Unterschlüssel des Netzwerkschlüssels abzurufen, und das Set-ItemProperty Cmdlet, um den Wert des RemotePath-Registrierungseintrags in jedem Schlüssel zu ändern. Set-ItemProperty Im Befehl ist der Pfad der PSPath-Eigenschaft des Registrierungsschlüssels. Dies ist eine Eigenschaft des Microsoft .NET Framework-Objekts, das den Registrierungsschlüssel und keinen Registrierungseintrag darstellt. Der Befehl verwendet die ToUpper()- Methode des RemotePath-Werts , bei dem es sich um eine Zeichenfolge (REG_SZ) handelt.

Da Set-ItemProperty die Eigenschaft jedes Schlüssels ändert, ist das cmdlet ForEach-Object erforderlich, um auf die Eigenschaft zuzugreifen.

Beispiel 5: Verwenden der $Null automatischen Variablen

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

In diesem Beispiel wird die Auswirkung der Verleitung der $Null automatischen Variablen an das Cmdlet ForEach-Object veranschaulicht.

Da PowerShell null als expliziten Platzhalter behandelt, generiert das ForEach-Object Cmdlet einen Wert für $Null, genau wie für andere Objekte, die Sie über die Pipeline an das Cmdlet übergeben.

Weitere Informationen zur $Null Variablen automatic finden Sie unter about_Automatic_Variables.

Beispiel 6: Abrufen von Eigenschaftswerten

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

Mit diesen Befehlen wird der Wert der Path-Eigenschaft aller installierten PowerShell-Module abgerufen. Sie verwenden den MemberName-Parameter , um die Path-Eigenschaft von Modulen anzugeben.

Der zweite Befehl entspricht dem ersten. Es verwendet den Foreach-Alias des ForEach-Object Cmdlets und lässt den Namen des MemberName-Parameters aus, der optional ist.

Das ForEach-Object Cmdlet ist sehr nützlich zum Abrufen von Eigenschaftswerten, da es den Wert abruft, ohne den Typ zu ändern, im Gegensatz zu den Format-Cmdlets oder dem Cmdlet, die Select-Object den Eigenschaftswerttyp ändern.

Beispiel 7: Aufteilen von Modulnamen in Komponentennamen

"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

Mit diesen Befehlen werden zwei durch Punkte getrennte Modulnamen in ihre Komponentennamen aufgeteilt. Die Befehle rufen die Split-Methode von Zeichenfolgen auf. Die drei Befehle verwenden unterschiedliche Syntax, aber sie sind gleichwertig und austauschbar.

Der erste Befehl verwendet die herkömmliche Syntax, die einen Skriptblock und den aktuellen Objektoperator $_enthält. Sie verwendet die Punktsyntax, um die Methode und Klammern anzugeben, um das Trennzeichenargument einzuschließen.

Der zweite Befehl verwendet den MemberName-Parameter , um die Split-Methode anzugeben, und den ArgumentName-Parameter , um den Punkt (".") als geteiltes Trennzeichen zu identifizieren.

Der dritte Befehl verwendet den Foreach-Alias des Cmdlets Foreach-Object und lässt die Namen der Parameter MemberName und ArgumentList aus, die optional sind.

Die Ausgabe dieser drei Befehle, wie unten gezeigt, ist identisch.

Split ist nur eine von vielen nützlichen Methoden für Strings. Um alle Eigenschaften und Methoden von Zeichenfolgen anzuzeigen, übergeben Sie eine Zeichenfolge an das Get-Member Cmdlet.

Parameter

-ArgumentList

Gibt ein Array von Argumenten für einen Methodenaufruf an.

Dieser Parameter wurde in Windows PowerShell 3.0 eingeführt.

Parametereigenschaften

Typ:

Object[]

Standardwert:None
Unterstützt Platzhalter:False
Nicht anzeigen:False
Aliase:Argumente

Parametersätze

PropertyAndMethodSet
Position:Named
Obligatorisch:False
Wert aus Pipeline:False
Wert aus Pipeline nach dem Eigenschaftsnamen:False
Wert aus verbleibenden Argumenten:False

-Begin

Gibt einen Skriptblock an, der ausgeführt wird, bevor dieses Cmdlet Eingabeobjekte verarbeitet.

Parametereigenschaften

Typ:ScriptBlock
Standardwert:None
Unterstützt Platzhalter:False
Nicht anzeigen:False

Parametersätze

ScriptBlockSet
Position:Named
Obligatorisch:False
Wert aus Pipeline:False
Wert aus Pipeline nach dem Eigenschaftsnamen:False
Wert aus verbleibenden Argumenten:False

-Confirm

Fordert Sie zur Bestätigung auf, bevor Sie das Cmdlet ausführen.

Parametereigenschaften

Typ:SwitchParameter
Standardwert:False
Unterstützt Platzhalter:False
Nicht anzeigen:False
Aliase:vgl

Parametersätze

(All)
Position:Named
Obligatorisch:False
Wert aus Pipeline:False
Wert aus Pipeline nach dem Eigenschaftsnamen:False
Wert aus verbleibenden Argumenten:False

-End

Gibt einen Skriptblock an, der ausgeführt wird, nachdem dieses Cmdlet alle Eingabeobjekte verarbeitet hat.

Parametereigenschaften

Typ:ScriptBlock
Standardwert:None
Unterstützt Platzhalter:False
Nicht anzeigen:False

Parametersätze

ScriptBlockSet
Position:Named
Obligatorisch:False
Wert aus Pipeline:False
Wert aus Pipeline nach dem Eigenschaftsnamen:False
Wert aus verbleibenden Argumenten:False

-InputObject

Gibt die Eingabeobjekte an. ForEach-Object führt die Skriptblock- oder Vorgangsanweisung für jedes Eingabeobjekt aus. Geben Sie eine Variable ein, die die Objekte enthält, oder geben Sie einen Befehl oder Ausdruck ein, der die Objekte ermittelt.

Wenn Sie den InputObject-Parameter mit ForEach-Object, anstelle von Befehlsergebnissen ForEach-Objectan die Leitung, verwenden, wird der InputObject-Wert als einzelnes Objekt behandelt. Dies gilt auch dann, wenn es sich bei dem Wert um eine Auflistung handelt, die das Ergebnis eines Befehls ist, z -InputObject (Get-Process). B. Da InputObject keine einzelnen Eigenschaften aus einem Array oder einer Auflistung von Objekten zurückgeben kann, wird empfohlen, dass Sie ForEach-ObjectForEach-Object in der Pipeline Vorgänge für eine Auflistung von Objekten ausführen, die über bestimmte Werte in definierten Eigenschaften verfügen, wie in den Beispielen in diesem Thema gezeigt.

Parametereigenschaften

Typ:PSObject
Standardwert:None
Unterstützt Platzhalter:False
Nicht anzeigen:False

Parametersätze

(All)
Position:Named
Obligatorisch:False
Wert aus Pipeline:True
Wert aus Pipeline nach dem Eigenschaftsnamen:False
Wert aus verbleibenden Argumenten:False

-MemberName

Gibt die abzurufende Eigenschaft oder die aufzurufende Methode an.

Wildcardzeichen sind zulässig, funktionieren jedoch nur, wenn die resultierende Zeichenfolge in einen eindeutigen Wert aufgelöst wird. Wenn Sie z. B. ausführen Get-Process | ForEach -MemberName *Nameund mehr als ein Member mit einem Namen vorhanden ist, der die Zeichenfolge Name enthält, z. B. die Eigenschaften ProcessName und Name , schlägt der Befehl fehl.

Dieser Parameter wurde in Windows PowerShell 3.0 eingeführt.

Parametereigenschaften

Typ:String
Standardwert:None
Unterstützt Platzhalter:True
Nicht anzeigen:False

Parametersätze

PropertyAndMethodSet
Position:0
Obligatorisch:True
Wert aus Pipeline:False
Wert aus Pipeline nach dem Eigenschaftsnamen:False
Wert aus verbleibenden Argumenten:False

-Process

Gibt den Vorgang an, der für jedes Eingabeobjekt ausgeführt wird. Geben Sie einen Skriptblock ein, der den Vorgang beschreibt.

Parametereigenschaften

Typ:

ScriptBlock[]

Standardwert:None
Unterstützt Platzhalter:False
Nicht anzeigen:False

Parametersätze

ScriptBlockSet
Position:0
Obligatorisch:True
Wert aus Pipeline:False
Wert aus Pipeline nach dem Eigenschaftsnamen:False
Wert aus verbleibenden Argumenten:False

-RemainingScripts

Gibt alle Skriptblöcke an, die nicht vom Parameter Process übernommen werden.

Dieser Parameter wurde in Windows PowerShell 3.0 eingeführt.

Parametereigenschaften

Typ:

ScriptBlock[]

Standardwert:None
Unterstützt Platzhalter:False
Nicht anzeigen:False

Parametersätze

ScriptBlockSet
Position:Named
Obligatorisch:False
Wert aus Pipeline:False
Wert aus Pipeline nach dem Eigenschaftsnamen:False
Wert aus verbleibenden Argumenten:False

-WhatIf

Zeigt, was passiert, wenn das Cmdlet ausgeführt wird. Das Cmdlet wird nicht ausgeführt.

Parametereigenschaften

Typ:SwitchParameter
Standardwert:False
Unterstützt Platzhalter:False
Nicht anzeigen:False
Aliase:Wi

Parametersätze

(All)
Position:Named
Obligatorisch:False
Wert aus Pipeline:False
Wert aus Pipeline nach dem Eigenschaftsnamen:False
Wert aus verbleibenden Argumenten:False

CommonParameters

Dieses Cmdlet unterstützt die allgemeinen Parameter -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutBuffer, -OutVariable, -PipelineVariable, -ProgressAction, -Verbose, -WarningAction und -WarningVariable. Weitere Informationen findest du unter about_CommonParameters.

Eingaben

PSObject

Sie können jedes Objekt an dieses Cmdlet weiterleiten.

Ausgaben

PSObject

Dieses Cmdlet gibt Objekte zurück, die von der Eingabe bestimmt werden.

Hinweise

  • Das cmdlet ForEach-Object funktioniert ähnlich wie die Foreach--Anweisung, mit der Ausnahme, dass Sie keine Eingaben an eine Foreach--Anweisung weiterleiten können. Weitere Informationen zur Foreach-Anweisung finden Sie unter about_Foreach.
  • Ab PowerShell 4.0 wurden Where- und ForEach Methoden für die Verwendung mit Sammlungen hinzugefügt.
  • Weitere Informationen zu diesen neuen Methoden finden Sie hier about_arrays