Delen via


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 (ook wel een foreach lus genoemd) is een taalconstructie voor het doorlopen (herhalen) van een reeks waarden in een verzameling items.

Het eenvoudigste en meest voorkomende type verzameling dat moet worden gekruist, is een matrix. Binnen een foreach lus is het gebruikelijk om een of meer opdrachten uit te voeren op elk item in een matrix.

Syntax

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 die moet worden herhaald. PowerShell maakt de variabele $<item> automatisch wanneer de foreach lus wordt uitgevoerd. Vóór elke herhaling van de lus wordt de variabele ingesteld op een waarde in de verzameling. Het blok na een foreach instructie {<statement list>} bevat een reeks opdrachten die moeten worden uitgevoerd op elk item in een verzameling.

Voorbeelden

Met 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 wordt de $letterArray matrix gemaakt en geïnitialiseerd met de tekenreekswaarden "a", "b", "c"en "d". De eerste keer dat de foreach instructie wordt uitgevoerd, wordt de $letter variabele gelijk aan het eerste item in $letterArray ("a") ingesteld. Vervolgens wordt de Write-Host cmdlet gebruikt om de letter a weer te geven. De volgende keer dat de lus wordt doorlopen, $letter wordt ingesteld op "b", enzovoort. Nadat de foreach lus de letter d weergeeft, wordt de lus door PowerShell afgesloten.

foreach -instructies kunnen ook worden gebruikt in combinatie 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 wordt geretourneerd.

foreach ($file in Get-ChildItem)
{
  Write-Host $file
}

U kunt het voorbeeld verfijnen door een if -instructie te gebruiken om de geretourneerde resultaten te beperken. In het volgende voorbeeld voert de foreach instructie dezelfde lusbewerking uit als in het vorige voorbeeld, maar er wordt een if -instructie toegevoegd om de resultaten te beperken tot bestanden die groter zijn dan 100 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 () uit te voeren.$file.length -gt 100KB De $file variabele bevat alle eigenschappen in het object dat door de Get-ChildItem cmdlet wordt geretourneerd. Daarom kunt u meer dan alleen een bestandsnaam retourneren. In het volgende voorbeeld retourneert PowerShell de lengte en de laatste toegangstijd in de instructielijst:

foreach ($file in Get-ChildItem)
{
  if ($file.length -gt 100KB)
  {
    Write-Host $file
    Write-Host $file.length
    Write-Host $file.lastaccesstime
  }
}

In dit voorbeeld bent u niet beperkt tot het uitvoeren van één opdracht in een instructielijst.

U kunt ook een variabele buiten een foreach lus gebruiken en de variabele binnen de lus verhogen. 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 100 KB in the current directory."
}
else {
  Write-Host "No files greater than 100 KB in the current directory."
}

In het voorgaande voorbeeld wordt de $i variabele ingesteld op 0 buiten de lus en wordt de variabele binnen de lus verhoogd voor elk gevonden bestand dat groter is dan 100 kB. Wanneer de lus wordt afgesloten, evalueert een if instructie de waarde van $i om een telling weer te geven van alle bestanden van meer dan 100 kB. Of er wordt een bericht weergegeven waarin staat dat er geen bestanden van meer dan 100 kB zijn gevonden.

In het vorige voorbeeld ziet u ook hoe u de resultaten van de bestandslengte kunt opmaken:

($file.length / 1024).ToString("F0")

De waarde wordt gedeeld door 1.024 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 zorgt ervoor dat de notatieaanduiding geen decimalen weergeeft.

In het volgende voorbeeld parseert de gedefinieerde functie PowerShell-scripts en scriptmodules en retourneert de locatie van functies in . In het voorbeeld ziet u hoe u de MoveNext methode (die op dezelfde manier werkt als skip X in een For lus) en de Current eigenschap van de $foreach variabele in een foreach-scriptblok gebruikt. De voorbeeldfunctie kan functies in een script vinden, zelfs als er ongebruikelijke of inconsistente functiedefinities zijn die meerdere regels omvatten.

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
          }
          Add-Member -InputObject $functionPosition `
            -TypeName FunctionPosition -PassThru
        }
      }
    }
    catch {
      throw
    }
  }
}

Zie ook

about_Automatic_Variables

about_If

ForEach-Object