about_For
Kısa açıklama
Koşullu teste dayalı deyimleri çalıştırmak için kullanabileceğiniz bir dil komutunu açıklar.
Uzun açıklama
For
deyimi (döngü olarak For
da bilinir), belirtilen bir koşul olarak değerlendirilirken komut bloğunda komutları çalıştıran bir döngü oluşturmak için $true
kullanabileceğiniz bir dil yapısıdır.
Döngünün For
tipik bir kullanımı, bir değer dizisini yinelemek ve bu değerlerin bir alt kümesi üzerinde çalışmaktır. Çoğu durumda, bir dizideki tüm değerleri yinelemek istiyorsanız, deyimini Foreach
kullanmayı göz önünde bulundurun.
Sözdizimi
Aşağıda deyim söz dizimi gösterilmektedir For
.
for (<Init>; <Condition>; <Repeat>)
{
<Statement list>
}
Init yer tutucusu, döngü başlamadan önce çalıştırılacak bir veya daha fazla komutu temsil eder. Genellikle başlangıç değeriyle bir değişken oluşturmak ve başlatmak için deyiminin Init bölümünü kullanırsınız.
Bu değişken, deyiminin sonraki bölümünde test edilecek koşulun For
temelini oluşturur.
Koşul yer tutucusu, deyiminin For
bir $true
veya $false
Boole değerine çözümleyen bölümünü temsil eder. PowerShell, döngü her For
çalıştığında koşulu değerlendirir. deyimi ise $true
, komut bloğundaki komutlar çalıştırılır ve deyimi yeniden değerlendirilir. Koşul hala $true
ise, Deyim listesindeki komutlar yeniden çalıştırılır.
Koşul olana kadar döngü yinelenir $false
.
Yinele yer tutucusu, döngü her yinelenirken yürütülen virgüllerle ayrılmış bir veya daha fazla komutu temsil eder. Bu genellikle deyiminin Koşul bölümünde test edilen bir değişkeni değiştirmek için kullanılır.
Deyim listesi yer tutucusu, döngü her girildiğinde veya yinelendiğinde çalıştırılan bir veya daha fazla komut kümesini temsil eder. Deyimi listesinin içeriği küme ayraçlarıyla çevrelenir.
Birden çok işlem için destek
Init deyiminde birden çok atama işlemi için aşağıdaki söz dizimleri desteklenir:
# Comma separated assignment expressions enclosed in parentheses.
for (($i = 0), ($j = 0); $i -lt 10; $i++)
{
"`$i:$i"
"`$j:$j"
}
# Sub-expression using the semicolon to separate statements.
for ($($i = 0;$j = 0); $i -lt 10; $i++)
{
"`$i:$i"
"`$j:$j"
}
Repeat deyiminde birden çok atama işlemi için aşağıdaki söz dizimleri desteklenir:
# Comma separated assignment expressions.
for (($i = 0), ($j = 0); $i -lt 10; $i++, $j++)
{
"`$i:$i"
"`$j:$j"
}
# Comma separated assignment expressions enclosed in parentheses.
for (($i = 0), ($j = 0); $i -lt 10; ($i++), ($j++))
{
"`$i:$i"
"`$j:$j"
}
# Sub-expression using the semicolon to separate statements.
for ($($i = 0;$j = 0); $i -lt 10; $($i++;$j++))
{
"`$i:$i"
"`$j:$j"
}
Not
Artım öncesi veya sonrası dışındaki işlemler tüm söz dizimleriyle çalışmayabilir.
Birden çok Koşul için aşağıdaki örnekte gösterildiği gibi mantıksal işleçler kullanın.
for (($i = 0), ($j = 0); $i -lt 10 -and $j -lt 10; $i++,$j++)
{
"`$i:$i"
"`$j:$j"
}
Daha fazla bilgi için bkz . about_Logical_Operators.
Söz dizimi örnekleri
En azından bir For
deyim, deyimin Init, Condition ve Repeat bölümünü çevreleyen parantezi ve deyimin Deyim listesi bölümünde küme ayraçlarıyla çevrili bir komutu gerektirir.
Yaklaşan örneklerde kasıtlı olarak deyimin dışındaki kodun gösterildiğini For
unutmayın. Sonraki örneklerde kod deyimiyle For
tümleştirilmiştir.
Örneğin, aşağıdaki For
deyim, CTRL+C tuşlarına basarak komuttan el ile ayrılana kadar değişkenin değerini $i
sürekli olarak görüntüler.
$i = 1
for (;;)
{
Write-Host $i
}
Aşağıdaki örnekte gösterildiği gibi, döngü her çalıştırıldığında değerinin $i
1 artırılarak deyim listesine ek komutlar ekleyebilirsiniz.
for (;;)
{
$i++; Write-Host $i
}
CTRL+C tuşlarına basarak komutun dışına çıkana kadar bu deyim, döngü her çalıştırıldığında değişkenin $i
değerini 1 artırıldığından sürekli olarak görüntüler.
Deyimin deyim listesi bölümündeki For
değişkenin değerini değiştirmek yerine deyiminin Repeat bölümünü For
aşağıdaki gibi kullanabilirsiniz.
$i=1
for (;;$i++)
{
Write-Host $i
}
CTRL+C tuşlarına basarak komuttan çıkana kadar bu deyim süresiz olarak yinelenir.
Bir koşul kullanarak döngünün For
sonlandırabilirsiniz. Deyimin Koşul bölümünü For
kullanarak bir koşul yerleştirebilirsiniz. Koşul For
olarak değerlendirildiğinde döngü sonlanır $false
.
Aşağıdaki örnekte, For
değeri $i
10'dan küçük veya buna eşitken döngü çalıştırılır.
$i=1
for(;$i -le 10;$i++)
{
Write-Host $i
}
Değişkeni deyiminin dışında For
oluşturmak ve başlatmak yerine, deyiminin For
Init bölümünü For
kullanarak döngünün içinde bu görevi gerçekleştirebilirsiniz.
for($i=1; $i -le 10; $i++){Write-Host $i}
Deyimin Init, Condition ve Repeat bölümlerini For
sınırlandırmak için noktalı virgül yerine satır başı kullanabilirsiniz. Aşağıdaki örnekte, bu alternatif söz dizimini kullanan bir For
gösterilmektedir.
for ($i = 0
$i -lt 10
$i++){
$i
}
Deyimin For
bu alternatif biçimi PowerShell betik dosyalarında ve PowerShell komut isteminde çalışır. Ancak, komut istemine For
etkileşimli komutlar girdiğinizde deyim söz dizimini noktalı virgülle kullanmak daha kolaydır.
Döngü For
, bir dizideki veya koleksiyondaki değerleri desenleri kullanarak artırmanıza olanak sağladığından döngü döngüden Foreach
daha esnektir. Aşağıdaki örnekte, değişkeni deyiminin $i
Repeat bölümünde For
2 artırılır.
for ($i = 0; $i -le 20; $i += 2)
{
Write-Host $i
}
Döngü For
, aşağıdaki örnekte olduğu gibi tek bir satıra da yazılabilir.
for ($i = 0; $i -lt 10; $i++) { Write-Host $i }
İşlevsel örnek
Aşağıdaki örnekte, bir For
dizi dosya üzerinde yineleme yapmak ve bunları yeniden adlandırmak için bir döngünün nasıl kullanılacağı gösterilmektedir. Klasördeki work_items
dosyaların dosya adı olarak iş öğesi kimlikleri vardır. Döngü, kimlik numarasının beş basamağı sıfıra doldurulmasını sağlamak için dosyalar arasında yinelenir.
İlk olarak, kod iş öğesi veri dosyalarının listesini alır. Bunların tümü, adları için biçimini <work-item-type>-<work-item-number>
kullanan JSON dosyalarıdır.
Değişkene $fileList
kaydedilen dosya bilgileri nesneleriyle, bunları ada göre sıralayabilir ve öğeler türe göre gruplandırılırken öğelerin kimliğe göre sıralanmalarının beklenmeyen olduğunu görebilirsiniz.
$fileList = Get-ChildItem -Path ./work_items
$fileList | Sort-Object -Descending -Property Name
bug-219.json
bug-41.json
bug-500.json
bug-697.json
bug-819.json
bug-840.json
feat-176.json
feat-367.json
feat-373.json
feat-434.json
feat-676.json
feat-690.json
feat-880.json
feat-944.json
maint-103.json
maint-367.json
maint-454.json
maint-49.json
maint-562.json
maint-579.json
İş öğelerini alfasayısal olarak sıraladığınızdan emin olmak için iş öğesi numaralarının sıfıra doldurulması gerekir.
Kod bunu ilk olarak en uzun sayısal soneki içeren iş öğesini arayarak yapar. Dizideki her dosyaya erişmek için dizini kullanarak bir for
döngü kullanarak dosyalar üzerinde döngü oluşturur. İş öğesi numarasını tamsayı yerine dize olarak ayıklamak için her dosya adını normal ifade deseni ile karşılaştırır. Ardından, en uzun sayıyı bulmak için iş öğesi numaralarının uzunluklarını karşılaştırır.
# Default the longest numeral count to 1, since it can't be smaller.
$longestNumeralCount = 1
# Regular expression to find the numerals in the filename - use a template
# to simplify updating the pattern as needed.
$patternTemplate = '-(?<WorkItemNumber>{{{0},{1}}})\.json'
$pattern = $patternTemplate -f $longestNumeralCount
# Iterate, checking the length of the work item number as a string.
for (
$i = 0 # Start at zero for first array item.
$i -lt $fileList.Count # Stop on the last item in the array.
$i++ # Increment by one to step through the array.
) {
if ($fileList[$i].Name -match $pattern) {
$numeralCount = $Matches.WorkItemNumber.Length
if ($numeralCount -gt $longestNumeralCount) {
# Count is higher, check against it for remaining items.
$longestNumeralCount = $numeralCount
# Update the pattern to speed up the search, ignoring items
# with a smaller numeral count using pattern matching.
$pattern = $patternTemplate -f $longestNumeralCount
}
}
}
Artık iş öğelerinin en fazla sayı sayısını bildiğinize göre, dosyaları gerektiği gibi yeniden adlandırmak için döngü yapabilirsiniz. Bir sonraki kod parçacığı, dosya listesi üzerinde yeniden yinelenir ve gerektiğinde bunları doldurur. Yalnızca sayı sayısı üst sınırından küçük olan dosyaları işlemek için başka bir normal ifade deseni kullanır.
# Regular expression to find the numerals in the filename, but only if the
# numeral count is smaller than the longest numeral count.
$pattern = $patternTemplate -f 1, ($longestNumeralCount - 1)
for (
$i = 0 # Start at zero for first array item.
$i -lt $fileList.Count # Stop on the last item in the array.
$i++ # Increment by one to step through the array.
) {
# Get the file from the array to process
$file = $fileList[$i]
# If the file doesn't need to be renamed, continue to the next file
if ($file.Name -notmatch $pattern) {
continue
}
# Get the work item number from the regular expression, create the
# padded string from it, and define the new filename by replacing
# the original number string with the padded number string.
$workItemNumber = $Matches.WorkItemNumber
$paddedNumber = "{0:d$longestNumeralCount}" -f $workItemNumber
$paddedName = $file.Name -replace $workItemNumber, $paddedNumber
# Rename the file with the padded work item number.
$file | Rename-Item -NewName $paddedName
}
Dosyalar yeniden adlandırıldığına göre, dosya listesini yeniden alabilir ve hem eski hem de yeni dosyaları ada göre sıralayabilirsiniz. Aşağıdaki kod parçacığı, yeni bir diziye kaydetmek ve ilk nesne kümesiyle karşılaştırmak için dosyaları yeniden alır. Ardından her iki dosya dizisini de sıralar ve sıralanmış dizileri yeni ve değişkenlerine $sortedOriginal
$sortedPadded
kaydeder. Son olarak, diziler üzerinde yineleme yapmak için bir for
döngü kullanır ve aşağıdaki özelliklere sahip bir nesne çıkışı verir:
- Dizin , sıralanmış dizilerdeki geçerli dizini temsil eder.
- Özgün , geçerli dizindeki özgün dosya adları sıralanmış dizisindeki öğedir.
- Padded , geçerli dizindeki sıralanmış dosya adları dizisindeki öğedir.
$paddedList = Get-ChildItem -path ./work_items
# Sort both file lists by name.
$sortedOriginal = $fileList | Sort-Object -Property Name
$sortedPadded = $renamedList | Sort-Object -Property Name
# Iterate over the arrays and output an object to simplify comparing how
# the arrays were sorted before and after padding the work item numbers.
for (
$i = 0
$i -lt $fileList.Count
$i++
) {
[pscustomobject] @{
Index = $i
Original = $sortedOriginal[$i].Name
Padded = $sortedPadded[$i].Name
}
}
Index Original Padded
----- -------- ------
0 bug-219.json bug-00041.json
1 bug-41.json bug-00219.json
2 bug-500.json bug-00500.json
3 bug-697.json bug-00697.json
4 bug-819.json bug-00819.json
5 bug-840.json bug-00840.json
6 feat-176.json feat-00176.json
7 feat-367.json feat-00367.json
8 feat-373.json feat-00373.json
9 feat-434.json feat-00434.json
10 feat-676.json feat-00676.json
11 feat-690.json feat-00690.json
12 feat-880.json feat-00880.json
13 feat-944.json feat-00944.json
14 maint-103.json maint-00049.json
15 maint-367.json maint-00103.json
16 maint-454.json maint-00367.json
17 maint-49.json maint-00454.json
18 maint-562.json maint-00562.json
19 maint-579.json maint-00579.json
Çıktıda, doldurmadan sonra sıralanan iş öğeleri beklenen sıradadır.
Ayrıca bkz.
PowerShell