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 a
string , , b
, c
dan 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
}
}
}