about_Foreach

Deskripsi singkat

Menjelaskan perintah bahasa yang bisa Anda gunakan untuk melintasi semua item dalam kumpulan item.

Deskripsi panjang

Pernyataan foreach ini adalah konstruksi bahasa untuk iterasi atas sekumpulan nilai dalam koleksi.

Jenis koleksi yang paling sederhana dan paling khas untuk dilalui adalah array. Dalam perulangan foreach , biasanya menjalankan satu atau beberapa perintah terhadap setiap item dalam array.

Sintaks

Berikut ini memperlihatkan foreach sintaks:

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

Bagian dari foreach pernyataan di dalam tanda kurung mewakili variabel dan koleksi untuk diulang. PowerShell membuat variabel $<item> secara otomatis saat perulangan foreach berjalan. Pada awal setiap iterasi, foreach atur variabel item ke nilai berikutnya dalam koleksi. {<statement list>} Blok berisi perintah yang akan dijalankan untuk setiap iterasi.

Contoh

Misalnya, perulangan foreach dalam contoh berikut menampilkan nilai dalam $letterArray array.

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

Dalam contoh ini, $letterArray berisi nilai astring , , b, cdan d. Pertama kali foreach pernyataan berjalan, pernyataan tersebut mengatur $letter variabel yang sama dengan item pertama di $letterArray (a). Kemudian, ia menggunakan Write-Host untuk menampilkan nilai . Lain kali melalui perulangan, $letter diatur ke b. Pola diulang untuk setiap item dalam array.

Anda juga dapat menggunakan foreach pernyataan dengan cmdlet yang mengembalikan kumpulan item. Dalam contoh berikut, pernyataan melangkah foreach melalui daftar item yang dikembalikan oleh Get-ChildItem cmdlet.

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

Anda dapat menyempurnakan contoh menggunakan if pernyataan untuk membatasi hasil yang dikembalikan. Dalam contoh berikut, if pernyataan membatasi hasil ke file yang lebih besar dari 100 kilobyte (KB):

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

Dalam contoh ini, perulangan foreach menggunakan properti $file variabel untuk melakukan operasi perbandingan ($file.length -gt 100KB). Variabel $file memiliki semua properti objek yang dikembalikan oleh Get-ChildItem.

Dalam contoh berikutnya, skrip menampilkan panjang dan waktu akses terakhir di dalam daftar pernyataan:

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

Anda juga dapat menggunakan variabel dari luar perulangan foreach . Contoh berikut menghitung file dengan ukuran lebih dari 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.'
}

Dalam contoh sebelumnya, $i dimulai dengan nilai 0 di luar perulangan. Kemudian, $i bertambah bertahap di dalam perulangan untuk setiap file yang lebih besar dari 100KB. Ketika perulangan keluar, pernyataan if mengevaluasi nilai untuk menampilkan jumlah file lebih dari $i 100KB.

Contoh sebelumnya juga menunjukkan cara memformat hasil panjang file:

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

Nilai dibagi 1.024 untuk memperlihatkan hasil dalam kilobyte daripada byte, dan nilai yang dihasilkan kemudian diformat menggunakan penentu format titik tetap untuk menghapus nilai desimal apa pun dari hasilnya. 0 membuat penentu format tidak menampilkan tempat desimal.

Fungsi berikut mengurai skrip PowerShell dan modul skrip dan mengembalikan lokasi fungsi yang ada di dalamnya. Contoh menunjukkan cara menggunakan MoveNext metode dan Current properti variabel di $foreach dalam foreach blok skrip.

Untuk informasi selengkapnya, lihat Menggunakan Enumerator.

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

Lihat juga