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 $truekullanabileceğ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 $trueise, 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 $sortedPaddedkaydeder. 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.