Sdílet prostřednictvím


about_For

Krátký popis

Popisuje příkaz jazyka, který můžete použít ke spouštění příkazů na základě podmíněného testu.

Dlouhý popis

Příkaz for (označovaný také jako smyčka for) je konstruktor jazyka, který můžete použít k vytvoření smyčky, která spouští příkazy v bloku příkazů, zatímco zadaná podmínka se vyhodnotí jako $true.

Typickým použitím smyčky for je iterace pole hodnot a operace s podmnožinou těchto hodnot. Pokud chcete ve většině případů iterovat všechny hodnoty v poli, zvažte použití příkazu foreach.

Syntax

Následující příklad ukazuje syntaxi příkazu for.

for (<Init>; <Condition>; <Repeat>)
{
    <Statement list>
}

Zástupný symbol Init představuje jeden nebo více příkazů, které se spustí před zahájením smyčky. Obvykle používáte Init část příkazu k vytvoření a inicializaci proměnné s počáteční hodnotou.

Tato proměnná pak bude základem podmínky, která se má testovat v další části příkazu for.

Zástupný symbol Podmínka představuje část příkazu for, která se přeloží na $true nebo $falselogickou hodnotu. PowerShell vyhodnotí podmínku při každém spuštění smyčky for. Pokud je příkaz $true, příkazy v bloku příkazů se spustí a příkaz se vyhodnotí znovu. Pokud je podmínka stále $true, příkazy v seznamu příkazů spustit znovu. Smyčka se opakuje, dokud se podmínka nestane $false.

Zástupný symbol Opakovat představuje jeden nebo více příkazů oddělených čárkami, které se spustí při každém opakování smyčky. Obvykle se používá k úpravě proměnné testované uvnitř podmínky části příkazu.

Seznam příkazů zástupný symbol představuje sadu jednoho nebo více příkazů, které se spustí při každém zadání nebo opakování smyčky. Obsah seznamu příkazů jsou obklopené složenými závorkami.

Podpora více operací

V příkazu Init se podporují následující syntaxe pro více operací přiřazení:

# 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"
}

V příkazu Repeat se podporují následující syntaxe pro více operací přiřazení:

# 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"
}

Poznámka

Operace jiné než před nebo po přírůstku nemusí fungovat se všemi syntaxemi.

Pro více Podmínky použít logické operátory, jak je znázorněno v následujícím příkladu.

for (($i = 0), ($j = 0); $i -lt 10 -and $j -lt 10; $i++,$j++)
{
    "`$i:$i"
    "`$j:$j"
}

Další informace naleznete v tématu about_Logical_Operators.

Příklady syntaxe

Minimálně příkaz for vyžaduje závorky obklopící inicializační, podmínkua Opakovat část příkazu a příkaz obklopený složenými závorkami v seznamu příkazů části příkazu.

Všimněte si, že nadcházející příklady záměrně zobrazují kód mimo příkaz for. V pozdějších příkladech je kód integrovaný do příkazu for.

Například následující příkaz for průběžně zobrazuje hodnotu proměnné $i, dokud příkaz ručně nepřerušíte stisknutím kombinace kláves CTRL+C.

$i = 1
for (;;)
{
    Write-Host $i
}

Do seznamu příkazů můžete přidat další příkazy, aby se hodnota $i při každém spuštění smyčky zvýší o 1, jak ukazuje následující příklad.

for (;;)
{
    $i++; Write-Host $i
}

Dokud příkaz nepřejdete stisknutím kombinace kláves CTRL+C, bude tento příkaz neustále zobrazovat hodnotu proměnné $i, protože se při každém spuštění smyčky zvýší o 1.

Místo změny hodnoty proměnné v části seznamu příkazů for můžete místo toho použít Opakovat část příkazu for následujícím způsobem.

$i=1
for (;;$i++)
{
    Write-Host $i
}

Tento příkaz se bude opakovat po neomezenou dobu, dokud příkaz nepřerušíte stisknutím kombinace kláves CTRL+C.

Smyčku for můžete ukončit pomocí podmínky. Podmínku můžete umístit pomocí Podmínky části příkazu for. Smyčka for se ukončí, když se podmínka vyhodnotí jako $false.

V následujícím příkladu se smyčka for spustí, zatímco hodnota $i je menší nebo rovna 10.

$i=1
for(;$i -le 10;$i++)
{
    Write-Host $i
}

Místo vytvoření a inicializace proměnné mimo příkaz for můžete tuto úlohu provést uvnitř smyčky for pomocí Inicializace části příkazu for.

for($i=1; $i -le 10; $i++){Write-Host $i}

Pokud chcete oddělovat inicializační, Podmínkua Opakovat části příkazu for, můžete použít místo středníků. Následující příklad ukazuje for, která používá tuto alternativní syntaxi.

for ($i = 0
  $i -lt 10
  $i++){
  $i
}

Tato alternativní forma příkazu for funguje v souborech skriptů PowerShellu a na příkazovém řádku PowerShellu. Při zadávání interaktivních příkazů na příkazovém řádku je ale jednodušší používat syntaxi příkazu for se středníky.

Smyčka for je flexibilnější než smyčka foreach, protože umožňuje zvýšit hodnoty v poli nebo kolekci pomocí vzorů. V následujícím příkladu se proměnná $i zvýší o 2 v části Repeat části příkazu for.

for ($i = 0; $i -le 20; $i += 2)
{
    Write-Host $i
}

Smyčku for lze také zapsat na jeden řádek jako v následujícím příkladu.

for ($i = 0; $i -lt 10; $i++){Write-Host $i}

Příklad funkčnosti

Následující příklad ukazuje, jak můžete pomocí smyčky for iterovat pole souborů a přejmenovat je. Soubory ve složce work_items mají jako název souboru ID pracovní položky. Smyčka prochází soubory, aby se zajistilo, že číslo ID je nula-padded až pět číslic.

Nejprve kód načte seznam datových souborů pracovních položek. Všechny soubory JSON, které používají formát <work-item-type>-<work-item-number> pro jejich název. Když jsou objekty s informacemi o souboru uložené do proměnné $fileList, můžete je seřadit podle názvu a zjistit, že když jsou položky seskupené podle typu, pořadí položek podle ID je neočekávané.

$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

Abyste měli jistotu, že pracovní položky můžete seřadit alfanumericky, musí být čísla pracovních položek bez nul.

Kód to provede tak, že nejprve vyhledá pracovní položku s nejdelší číselnou příponou. Smyčka přes soubory pomocí smyčky for pomocí indexu pro přístup k jednotlivým souborům v poli. Porovná každý název souboru se vzorem regulárního výrazu a extrahuje číslo pracovní položky jako řetězec místo celého čísla. Potom porovná délky čísel pracovních položek a najde nejdelší číslo.

# 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
        }
    }
}

Teď, když znáte maximální počet číslic pro pracovní položky, můžete soubory podle potřeby přejmenovat pomocí smyčky. Další fragment kódu iteruje znovu seznam souborů a podle potřeby je odsadí. Pomocí jiného vzoru regulárního výrazu zpracovává pouze soubory s počtem číslic menšími než maximum.

# 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
}

Teď, když jsou soubory přejmenovány, můžete znovu načíst seznam souborů a seřadit staré i nové soubory podle názvu. Následující fragment kódu znovu načte soubory, které se uloží do nového pole, a porovná s počáteční sadou objektů. Potom seřadí obě pole souborů, uloží seřazená pole do nových proměnných $sortedOriginal a $sortedPadded. Nakonec používá smyčku for k iteraci polí a výstupu objektu s následujícími vlastnostmi:

  • index představuje aktuální index v seřazených polích.
  • Původní je položka v seřazené matici původních názvů v aktuálním indexu.
  • padded je položka v seřazené matici vycpaných názvů souborů v aktuálním indexu.
$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

Ve výstupu jsou seřazené pracovní položky po odsazení v očekávaném pořadí.

Viz také