about_Foreach

Kısa açıklama

Bir öğe koleksiyonundaki tüm öğeler arasında geçiş yapmak için kullanabileceğiniz bir dil komutunu açıklar.

Uzun açıklama

deyimi foreach , bir koleksiyondaki bir dizi değer üzerinde yinelemeye yönelik bir dil yapısıdır.

Geçiş için en basit ve en tipik koleksiyon türü bir dizidir. Döngü foreach içinde, bir dizideki her öğeye karşı bir veya daha fazla komut çalıştırmak yaygın bir durumdur.

Sözdizimi

Aşağıda söz dizimi gösterilmektedir foreach :

foreach ($<item> in $<collection>){<statement list>}

deyiminin foreach parantez içindeki bölümü bir değişkeni ve yinelemek için bir koleksiyonu temsil eder. PowerShell, döngü çalıştırıldığında foreach değişkeni $<item> otomatik olarak oluşturur. Her yinelemenin başlangıcında, foreach öğe değişkenini koleksiyondaki bir sonraki değere ayarlar. Blok, {<statement list>} her yineleme için yürütülecek komutları içerir.

Örnekler

Örneğin, foreach aşağıdaki örnekteki döngü dizideki $letterArray değerleri görüntüler.

$letterArray = 'a','b','c','d'
foreach ($letter in $letterArray)
{
  Write-Host $letter
}

Bu örnekte , $letterArray , bcve ddize değerlerini aiçerir. deyimi ilk kez foreach çalıştırıldığında değişkenini $letter içindekia ilk öğeye $letterArray eşit olarak ayarlar. Ardından değerini görüntülemek için kullanır Write-Host . Döngüde bir sonraki sefer olarak $letter ayarlanır b. Dizideki her öğe için desen yineler.

Deyimleri, bir öğe koleksiyonu döndüren cmdlet'lerle de kullanabilirsiniz foreach . Aşağıdaki örnekte, foreach deyimi cmdlet'i tarafından döndürülen öğe listesinde adım Get-ChildItem adım ilerler.

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

Döndürülen sonuçları sınırlamak için deyimini if kullanarak örneği geliştirebilirsiniz. Aşağıdaki örnekte deyimi, if sonuçları 100 kilobayttan (KB) büyük dosyalarla sınırlar:

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

Bu örnekte, foreach döngü bir karşılaştırma işlemi ($file.length -gt 100KB) gerçekleştirmek için değişkeninin $file bir özelliğini kullanır. değişkeni, $file tarafından döndürülen nesnenin tüm özelliklerine Get-ChildItemsahiptir.

Sonraki örnekte betik, deyimi listesinin içinde uzunluğu ve son erişim zamanını görüntüler:

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

Ayrıca döngü dışından foreach değişkenleri de kullanabilirsiniz. Aşağıdaki örnek boyutu 100 KB'ın üzerindeki dosyaları sayar:

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

Yukarıdaki örnekte, $i döngü dışında bir değerle 0 başlar. Ardından, $i 100 KB'tan büyük her dosya için döngü içinde artırılır. Döngüden çıkıldığında, deyimi if değerini $i değerlendirerek 100 KB üzerindeki dosya sayısını görüntüler.

Önceki örnekte ayrıca dosya uzunluğu sonuçlarının nasıl biçimlendirilir gösterilmektedir:

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

Değer, sonuçları bayt yerine kilobayt cinsinden göstermek için 1.024'e bölünür ve sonuçtaki ondalık değerleri kaldırmak için sonuç değeri sabit nokta biçim tanımlayıcısı kullanılarak biçimlendirilir. , 0 biçim belirticisinin ondalık basamak göstermemesini sağlar.

Aşağıdaki işlev PowerShell betiklerini ve betik modüllerini ayrıştırarak içindeki işlevlerin konumunu döndürür. Örnekte, bir betik bloğunun MoveNext içindeki değişkenin yönteminin ve Current özelliğinin $foreach nasıl kullanılacağı gösterilmektedir foreach .

Daha fazla bilgi için bkz . Numaralandırmaları Kullanma.

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

Ayrıca bkz.