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
, b
c
ve d
dize değerlerini a
iç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-ChildItem
sahiptir.
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.
PowerShell
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin