Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 (for döngüsü olarak da bilinir), belirtilen bir koşul $trueolarak değerlendirilirken komut bloğunda komutları çalıştıran bir döngü oluşturmak için kullanabileceğiniz bir dil yapısıdır.
for döngüsünün 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, foreach deyimi kullanmayı göz önünde bulundurun.
Sözdizimi
Aşağıda for deyimi söz dizimi gösterilmektedir.
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. Bir değişkeni başlangıç değeriyle oluşturmak ve başlatmak için genellikle deyiminin Init bölümünü kullanırsınız.
Bu değişken, for deyiminin sonraki bölümünde test edilecek koşulun temelini oluşturur.
Koşulu yer tutucusu, for deyiminin bir $true veya $falseBoole değerine çözümleyen bölümünü temsil eder. PowerShell, for döngüsü her çalıştığında koşulu değerlendirir. deyimi $trueise, komut bloğundaki komutlar çalıştırılır ve deyimi yeniden değerlendirilir. Koşul hala $trueise, Deyimi listesindeki komutlar yeniden çalıştırılır.
Koşul $falseolana kadar döngü yinelenir.
Yineleme yer tutucusu, döngü her yinelenirken yürütülen virgüllerle ayrılmış bir veya daha fazla komutu temsil eder. Genellikle bu, deyiminin Koşulu bölümünde test edilen bir değişkeni değiştirmek için kullanılır.
Deyimi listesi yer tutucusu, döngüye her girildiğinde veya yinelendiğinde çalıştırılan bir veya daha fazla komut kümesini temsil eder. Deyimi listesi 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şulu 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, for deyimi, Init, Conditionve Repeat bölümünü ve deyimin Deyimi listesindeki küme ayraçları bir komutu çevreleyen bir komutu çevreleyen ayraç gerektirir.
Yaklaşan örneklerde kodun kasıtlı olarak for deyiminin dışında gösterildiğini unutmayın. Sonraki örneklerde kod, for deyimiyle tümleştirilmiştir.
Örneğin, aşağıdaki for deyimi, CTRL+C tuşlarına basarak komuttan el ile ayrılana kadar $i değişkeninin değerini 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 $i değerinin 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, döngü her çalıştırıldığında $i değişkeni 1 artırıldığından, bu deyim sürekli olarak $i değişkeninin değerini görüntüler.
for deyiminin deyim listesi bölümündeki değişkenin değerini değiştirmek yerine, deyiminin for bölümünü 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.
for döngüsünü birkoşulu kullanarak sonlandırabilirsiniz.
deyiminin for bölümünü kullanarak bir koşul yerleştirebilirsiniz. koşul forolarak değerlendirildiğinde $false döngüsü sonlanır.
Aşağıdaki örnekte, for değeri 10'dan küçük veya buna eşitken $i döngüsü çalıştırılır.
$i=1
for(;$i -le 10;$i++)
{
Write-Host $i
}
değişkeni for deyiminin dışında oluşturup başlatmak yerine, for deyiminin Init bölümünü kullanarak for döngüsü içinde bu görevi gerçekleştirebilirsiniz.
for($i=1; $i -le 10; $i++){Write-Host $i}
Init, Koşulve deyiminin for 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
}
for deyiminin bu alternatif biçimi, PowerShell betik dosyalarında ve PowerShell komut isteminde çalışır. Ancak, komut istemine etkileşimli komutlar girdiğinizde for deyimi söz dizimini noktalı virgülle kullanmak daha kolaydır.
for döngüsü, desenleri kullanarak bir dizi veya koleksiyondaki değerleri artırmanıza olanak sağladığından foreach döngüsünden daha esnektir. Aşağıdaki örnekte, $i deyiminin Repeat bölümünde for değişkeni 2 artırılır.
for ($i = 0; $i -le 20; $i += 2)
{
Write-Host $i
}
for döngüsü, 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 dizi dosya üzerinde yineleme yapmak ve bunları yeniden adlandırmak için bir for döngüsünü nasıl kullanabileceğiniz gösterilmektedir.
work_items klasöründeki 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 <work-item-type>-<work-item-number> biçimini kullanan JSON dosyalarıdır.
$fileList değişkenine 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ıralanması beklenmeyen bir durumdur.
$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üsü 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, sıralanmış dizileri $sortedOriginal ve $sortedPaddedyeni değişkenlere kaydederek her iki dosya dizisini de sıralar. Son olarak, dizileri yinelemek için bir for döngüsü 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 bakınız
PowerShell