about_Foreach
Kurze Beschreibung
Beschreibt einen Sprachbefehl, den Sie verwenden können, um alle Elemente in einer Auflistung von Elementen zu durchlaufen.
Lange Beschreibung
Die foreach
Anweisung ist ein Sprachkonstrukt zum Durchlaufen einer Gruppe von Werten in einer Auflistung.
Der einfachste und am häufigsten zu durchlaufende Sammlungstyp ist ein Array.
In einer foreach
Schleife ist es üblich, einen oder mehrere Befehle für jedes Element in einem Array auszuführen.
Syntax
Die folgende Syntax zeigt foreach
:
foreach ($<item> in $<collection>){<statement list>}
Der Teil der Anweisung innerhalb einer foreach
Klammer stellt eine Variable und eine Auflistung dar, die durchlaufen werden soll. PowerShell erstellt die Variable $<item>
automatisch, wenn die foreach
Schleife ausgeführt wird. Legt am Anfang jeder Iteration foreach
die Elementvariable auf den nächsten Wert in der Auflistung fest. Der {<statement list>}
Block enthält die Befehle, die für jede Iteration ausgeführt werden sollen.
Beispiele
Die Schleife im folgenden Beispiel zeigt beispielsweise foreach
die Werte im $letterArray
Array an.
$letterArray = 'a','b','c','d'
foreach ($letter in $letterArray)
{
Write-Host $letter
}
In diesem Beispiel enthält die $letterArray
Zeichenfolgenwerte a
, b
, , c
und d
. Wenn die foreach
Anweisung zum ersten Mal ausgeführt wird, wird die $letter
Variable auf das erste Element in $letterArray
(a
) festgelegt. Anschließend wird Write-Host
der Wert angezeigt. Das nächste Mal durch die Schleife $letter
wird auf b
. Das Muster wird für jedes Element im Array wiederholt.
Sie können auch Anweisungen mit Cmdlets verwenden foreach
, die eine Sammlung von Elementen zurückgeben. Im folgenden Beispiel führt die foreach
Anweisung die Liste der vom Cmdlet zurückgegebenen Elemente durch Get-ChildItem
.
foreach ($file in Get-ChildItem)
{
Write-Host $file
}
Sie können das Beispiel mithilfe einer if
Anweisung verfeinern, um die zurückgegebenen Ergebnisse einzuschränken. Im folgenden Beispiel beschränkt die if
Anweisung die Ergebnisse auf Dateien, die größer als 100 KB sind:
foreach ($file in Get-ChildItem)
{
if ($file.Length -gt 100KB)
{
Write-Host $file
}
}
In diesem Beispiel verwendet die foreach
Schleife eine Eigenschaft der $file
Variablen zum Ausführen eines Vergleichsvorgangs ($file.length -gt 100KB
). Die $file
Variable verfügt über alle Eigenschaften des Objekts, das von der Get-ChildItem
.
Im nächsten Beispiel zeigt das Skript die Länge und die uhrzeit des letzten Zugriffs innerhalb der Anweisungsliste an:
foreach ($file in Get-ChildItem)
{
if ($file.Length -gt 100KB)
{
Write-Host $file
Write-Host $file.Length
Write-Host $file.LastAccessTime
}
}
Sie können variablen auch außerhalb einer foreach
Schleife verwenden. Im folgenden Beispiel werden Dateien mit einer Größe von mehr als 100 KB zählt:
$i = 0
foreach ($file in Get-ChildItem) {
if ($file.length -gt 100KB) {
Write-Host $file 'file size:' ($file.length / 1024).ToString('F0') KB
$i = $i + 1
}
}
if ($i -ne 0) {
Write-Host
Write-Host $i ' file(s) over 100KB in the current directory.'
}
else {
Write-Host 'No files greater than 100KB in the current directory.'
}
Im vorherigen Beispiel $i
beginnt mit einem Wert außerhalb 0
der Schleife.
Anschließend wird innerhalb der Schleife für jede Datei, die größer als 100 KB ist, $i
erhöht. Wenn die Schleife beendet wird, wertet eine if
Anweisung den Wert aus $i
, um eine Anzahl von Dateien über 100 KB anzuzeigen.
Im vorherigen Beispiel wird auch veranschaulicht, wie die Ergebnisse der Dateilänge formatiert werden:
($file.length / 1024).ToString('F0')
Der Wert wird durch 1.024 dividiert, um die Ergebnisse in Kilobyte anstelle von Bytes anzuzeigen, und der resultierende Wert wird dann mit dem Festkommaformatbezeichner formatiert, um alle Dezimalwerte aus dem Ergebnis zu entfernen. Der 0
Formatbezeichner zeigt keine Dezimalstellen an.
Die folgende Funktion analysiert PowerShell-Skripts und Skriptmodule und gibt den Speicherort der darin enthaltenen Funktionen zurück. Das Beispiel veranschaulicht, wie die MoveNext
Methode und die Current
Eigenschaft der $foreach
Variablen innerhalb eines foreach
Skriptblocks verwendet werden.
Weitere Informationen finden Sie unter Verwenden von Enumeratoren.
function Get-FunctionPosition {
[CmdletBinding()]
[OutputType('FunctionPosition')]
param(
[Parameter(Position = 0, Mandatory,
ValueFromPipeline, ValueFromPipelineByPropertyName)]
[ValidateNotNullOrEmpty()]
[Alias('PSPath')]
[System.String[]]
$Path
)
process {
try {
$filesToProcess = if ($_ -is [System.IO.FileSystemInfo]) {
$_
} else {
Get-Item -Path $Path
}
$parser = [System.Management.Automation.Language.Parser]
foreach ($item in $filesToProcess) {
if ($item.PSIsContainer -or
$item.Extension -notin @('.ps1', '.psm1')) {
continue
}
$tokens = $errors = $null
$ast = $parser::ParseFile($item.FullName, ([ref]$tokens),
([ref]$errors))
if ($errors) {
$msg = "File '{0}' has {1} parser errors." -f $item.FullName,
$errors.Count
Write-Warning $msg
}
:tokenLoop foreach ($token in $tokens) {
if ($token.Kind -ne 'Function') {
continue
}
$position = $token.Extent.StartLineNumber
do {
if (-not $foreach.MoveNext()) {
break tokenLoop
}
$token = $foreach.Current
} until ($token.Kind -in @('Generic', 'Identifier'))
$functionPosition = [pscustomobject]@{
Name = $token.Text
LineNumber = $position
Path = $item.FullName
}
$addMemberSplat = @{
InputObject = $functionPosition
TypeName = 'FunctionPosition'
PassThru = $true
}
Add-Member @addMemberSplat
}
}
}
catch {
throw
}
}
}