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 For smyčka) je konstruktor jazyka, který můžete použít k vytvoření smyčky, která spouští příkazy v bloku příkazů, zatímco se zadaná podmínka 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 matici, zvažte použití Foreach příkazu.

Syntaxe

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

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

Zástupný symbol Init představuje jeden nebo více příkazů, které se spouští před zahájením smyčky. Inicializační část příkazu obvykle používáte 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 For příkazu.

Zástupný symbol podmínky představuje část For příkazu, která se překládá na $true $false logickou hodnotu. PowerShell vyhodnotí podmínku při každém spuštění smyčky For . Pokud příkaz je $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ů se znovu spustí. Smyčka se opakuje, dokud se podmínka nestane $false.

Zástupný symbol Repeat 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é, která se testuje uvnitř části podmínky příkazu.

Zástupný symbol seznamu příkazů představuje sadu jednoho nebo více příkazů, které se spouští při každém zadání nebo opakování smyčky. Obsah seznamu příkazů je 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 jsou podporovány 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ínek použijte 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 najdete v tématu about_Logical_Operators.

Příklady syntaxe

Minimálně For příkaz vyžaduje závorky obklopící část příkazu Init, Condition a Repeat a příkaz obklopený složenými závorkami v části příkazu se seznamem příkazů.

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

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

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

Do seznamupříkazůch $i

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

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

Místo toho, abyste změnili hodnotu proměnné v části For příkazu seznamu příkazů, můžete místo toho použít část For Příkazu Repeat, jak je znázorněno níže.

$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í části Podmínka 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 For příkaz můžete tuto úlohu provést uvnitř For smyčky pomocí inicializační části For příkazu.

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

K oddělení inicializačních, podmínek a opakování příkazů můžete místo středníků použít návraty For na začátek řádku. Následující příklad ukazuje For , že používá tuto alternativní syntaxi.

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

Tato alternativní forma příkazu funguje v souborech skriptů For 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 For syntaxi příkazu se středníky.

Smyčka For je flexibilnější než Foreach smyčka, protože umožňuje zvýšit hodnoty v poli nebo kolekci pomocí vzorů. V následujícím příkladu $i se proměnná zvýší o 2 v části Repeat 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í For smyčky iterovat pole souborů a přejmenovat je. Soubory ve work_items složce 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. Jsou to 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 $fileList proměnné, 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í for smyčky pomocí indexu pro přístup ke každému souboru 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ů. Pak seřadí obě pole souborů, uloží seřazená pole do nových proměnných $sortedOriginal a $sortedPadded. Nakonec pomocí for smyčky iteruje pole a vypíše objekt 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é názvy 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é