about_Foreach
Korte beschrijving
Beschrijft een taalopdracht die u kunt gebruiken om alle items in een verzameling items te doorlopen.
Lange beschrijving
De foreach
instructie is een taalconstructie voor het herhalen van een set waarden in een verzameling.
Het eenvoudigste en meest typische type verzameling dat moet worden doorkruist, is een matrix.
Binnen een foreach
lus is het gebruikelijk om een of meer opdrachten uit te voeren voor elk item in een matrix.
Syntaxis
Hieronder ziet u de foreach
syntaxis:
foreach ($<item> in $<collection>){<statement list>}
Het deel van de foreach
instructie tussen haakjes vertegenwoordigt een variabele en een verzameling om te herhalen. PowerShell maakt de variabele $<item>
automatisch wanneer de foreach
lus wordt uitgevoerd. Aan het begin van elke iteratie foreach
stelt u de itemvariabele in op de volgende waarde in de verzameling. Het {<statement list>}
blok bevat de opdrachten die moeten worden uitgevoerd voor elke iteratie.
Voorbeelden
In de foreach
lus in het volgende voorbeeld worden bijvoorbeeld de waarden in de $letterArray
matrix weergegeven.
$letterArray = 'a','b','c','d'
foreach ($letter in $letterArray)
{
Write-Host $letter
}
In dit voorbeeld bevat de $letterArray
tekenreekswaardena
, b
, en c
d
. De eerste keer dat de foreach
instructie wordt uitgevoerd, wordt de $letter
variabele ingesteld die gelijk is aan het eerste item in $letterArray
(a
). Vervolgens wordt Write-Host
de waarde weergegeven. De volgende keer dat de lus wordt doorlopen, $letter
is ingesteld op b
. Het patroon wordt herhaald voor elk item in de matrix.
U kunt ook instructies gebruiken foreach
met cmdlets die een verzameling items retourneren. In het volgende voorbeeld doorloopt de foreach
instructie de lijst met items die door de Get-ChildItem
cmdlet worden geretourneerd.
foreach ($file in Get-ChildItem)
{
Write-Host $file
}
U kunt het voorbeeld verfijnen met behulp van een if
instructie om de geretourneerde resultaten te beperken. In het volgende voorbeeld beperkt de if
instructie de resultaten tot bestanden die groter zijn dan 100 kilobytes (KB):
foreach ($file in Get-ChildItem)
{
if ($file.Length -gt 100KB)
{
Write-Host $file
}
}
In dit voorbeeld gebruikt de foreach
lus een eigenschap van de $file
variabele om een vergelijkingsbewerking ($file.length -gt 100KB
) uit te voeren. De $file
variabele heeft alle eigenschappen van het object dat door de Get-ChildItem
variabele wordt geretourneerd.
In het volgende voorbeeld wordt in het script de lengte en de laatste toegangstijd in de lijst met instructies weergegeven:
foreach ($file in Get-ChildItem)
{
if ($file.Length -gt 100KB)
{
Write-Host $file
Write-Host $file.Length
Write-Host $file.LastAccessTime
}
}
U kunt ook variabelen van buiten een foreach
lus gebruiken. In het volgende voorbeeld worden bestanden geteld die groter zijn dan 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.'
}
In het voorgaande voorbeeld $i
begint u met een waarde van 0
buiten de lus.
$i
Vervolgens wordt de lus verhoogd voor elk bestand dat groter is dan 100 kB. Wanneer de lus wordt afgesloten, evalueert een if
instructie de waarde van $i
het weergeven van een aantal bestanden van meer dan 100 KB.
In het vorige voorbeeld ziet u ook hoe u de resultaten van de bestandsgrootte opmaken:
($file.Length / 1024).ToString('F0')
De waarde wordt gedeeld door 1024 om de resultaten weer te geven in kilobytes in plaats van bytes. De resulterende waarde wordt vervolgens opgemaakt met behulp van de notatieaanduiding met vaste punten om decimale waarden uit het resultaat te verwijderen. De 0
notatieaanduiding geeft geen decimalen weer.
De volgende functie parseert PowerShell-scripts en scriptmodules en retourneert de locatie van functies die zijn opgenomen in. In het voorbeeld ziet u hoe u de MoveNext
methode en de Current
eigenschap van de $foreach
variabele in een foreach
scriptblok gebruikt.
Zie Enumerators gebruiken voor meer informatie.
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
}
}
}