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 eines Wertesatzes in einer Auflistung.
Der einfachste und am häufigsten zu durchlaufende Sammlungstyp ist ein Array.
Innerhalb einer foreach
Schleife ist es üblich, einen oder mehrere Befehle für jedes Element in einem Array auszuführen.
Syntax
Im Folgenden wird die foreach
Syntax veranschaulicht:
foreach ($<item> in $<collection>){<statement list>}
Der Teil der foreach
Anweisung in Klammern 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 zu Beginn 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 der $letterArray
die Zeichenfolgenwerte a
, b
, c
und d
. Bei der ersten Ausführung der foreach
Anweisung wird die $letter
Variable gleich dem ersten Element in $letterArray
(a
) festgelegt. Anschließend wird Write-Host
verwendet, um den Wert anzuzeigen. Das nächste Mal, wenn die Schleife durchläuft, $letter
ist auf b
festgelegt. Das Muster wird für jedes Element im Array wiederholt.
Sie können Anweisungen auch mit Cmdlets verwenden foreach
, die eine Auflistung von Elementen zurückgeben. Im folgenden Beispiel durchläuft die foreach
Anweisung die Liste der vom Get-ChildItem
Cmdlet zurückgegebenen Elemente.
foreach ($file in Get-ChildItem)
{
Write-Host $file
}
Sie können das Beispiel mithilfe einer if
-Anweisung verfeinern, um die zurückgegebenen Ergebnisse zu begrenzen. Im folgenden Beispiel beschränkt die Anweisung die if
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, um einen Vergleichsvorgang ($file.length -gt 100KB
) auszuführen. Die $file
Variable verfügt über alle Eigenschaften des -Objekts, das Get-ChildItem
vom zurückgegeben wird.
Im nächsten Beispiel zeigt das Skript die Länge und die letzte Zugriffszeit in 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 auch Variablen außerhalb einer foreach
Schleife verwenden. Das folgende Beispiel zählt Dateien mit einer Größe von mehr als 100 KB:
$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 der 0
Schleife.
Anschließend wird innerhalb der Schleife für jede Datei erhöht, $i
die größer als 100 KB ist. Wenn die Schleife beendet wird, wertet eine if
Anweisung den Wert von $i
aus, um eine Anzahl von Dateien über 100 KB anzuzeigen.
Im vorherigen Beispiel wird auch veranschaulicht, wie die Dateilängenergebnisse formatiert werden:
($file.length / 1024).ToString('F0')
Der Wert wird durch 1.024 geteilt, um die Ergebnisse in Kilobyte statt in Bytes anzuzeigen, und der resultierende Wert wird dann mit dem Festpunktformatbezeichner formatiert, um alle Dezimalwerte aus dem Ergebnis zu entfernen. Dadurch 0
wird der Formatbezeichner ohne Dezimalstellen angezeigt.
Die folgende Funktion analysiert PowerShell-Skripts und Skriptmodule und gibt den Speicherort der darin enthaltenen Funktionen zurück. Im Beispiel wird veranschaulicht, wie die MoveNext
-Methode und die Current
-Eigenschaft der $foreach
Variablen in einem foreach
Skriptblock 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
}
}
}