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í.