Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Deskripsi singkat
Menjelaskan perintah bahasa yang bisa Anda gunakan untuk melintasi semua item dalam kumpulan item.
Deskripsi panjang
Pernyataan foreach adalah konstruksi bahasa untuk iterasi atas sekumpulan nilai dalam koleksi.
Jenis koleksi yang paling sederhana dan paling khas untuk dijelajahi adalah array.
Dalam perulangan foreach, biasanya menjalankan satu atau beberapa perintah terhadap setiap item dalam array.
Syntax
Berikut ini memperlihatkan sintaks foreach:
foreach ($<item> in $<collection>){<statement list>}
Bagian dari pernyataan foreach di dalam tanda kurung mewakili sebuah variabel dan sebuah koleksi untuk diiterasi. PowerShell membuat variabel $<item> secara otomatis saat perulangan foreach berjalan. Pada awal setiap iterasi, foreach mengatur variabel item ke nilai berikutnya dalam koleksi. Blok {<statement list>} berisi perintah yang akan dijalankan untuk setiap iterasi.
Contoh
Misalnya, perulangan foreach dalam contoh berikut menampilkan nilai dalam array $letterArray.
$letterArray = 'a','b','c','d'
foreach ($letter in $letterArray)
{
Write-Host $letter
}
Dalam contoh ini, $letterArray berisi nilai string a, b, c, dan d. Pertama kali pernyataan foreach berjalan, ia mengatur variabel $letter sama dengan item pertama dalam $letterArray (a). Kemudian, menggunakan Write-Host untuk menampilkan nilai . Pada iterasi berikutnya, $letter diatur ke b. Pola diulang untuk setiap item dalam array.
Anda juga dapat menggunakan pernyataan foreach dengan cmdlet yang mengembalikan kumpulan item. Dalam contoh berikut, pernyataan foreach melangkah melalui daftar item yang dikembalikan oleh cmdlet Get-ChildItem.
foreach ($file in Get-ChildItem)
{
Write-Host $file
}
Anda dapat menyempurnakan contoh menggunakan pernyataan if untuk membatasi hasil yang dikembalikan. Dalam contoh berikut, pernyataan if 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 variabel $file 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 ditingkatkan di dalam loop untuk setiap file yang lebih besar dari 100KB. Setelah perulangan selesai, pernyataan if menghitung nilai $i untuk menampilkan jumlah file lebih dari 100KB.
Contoh sebelumnya juga menunjukkan cara memformat hasil panjang file:
($file.Length / 1024).ToString('F0')
Nilai dibagi 1.024 untuk menampilkan hasil dalam kilobyte bukan 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 menunjukkan 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 pernyataan.
Untuk informasi lebih lanjut, 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
- about_Automatic_Variables
- about_If
- ForEach-Object