about_For
Rövid leírás
Egy feltételes teszten alapuló utasítások futtatására használható nyelvi parancsot ismertet.
Hosszú leírás
Az For
utasítás (más néven For
hurok) egy olyan nyelvi szerkezet, amellyel parancsokat futtat egy parancsblokkban, miközben egy adott feltétel kiértékeli azt $true
.
A hurok tipikus használata For
az értékek tömbjének iterálása és ezeknek az értékeknek egy részhalmazán való működés. A legtöbb esetben, ha egy tömb összes értékét meg szeretné iterálni, fontolja meg egy Foreach
utasítás használatát.
Syntax
Az alábbiakban az utasítás szintaxisa For
látható.
for (<Init>; <Condition>; <Repeat>)
{
<Statement list>
}
Az Init helyőrző egy vagy több parancsot jelöl, amelyek a ciklus megkezdése előtt futnak. Az utasítás Init része általában egy kezdő értékkel rendelkező változó létrehozásához és inicializálásához használható.
Ez a változó lesz az alapja annak a feltételnek, amely az utasítás következő részében For
tesztelendő.
A Feltétel helyőrzője az utasítás egy $true
vagy $false
logikai értékre feloldott részét For
jelöli. A PowerShell a ciklus minden futtatásakor kiértékeli a feltételt For
. Ha az utasítás az $true
, a parancsblokk parancsai futnak, és a rendszer ismét kiértékeli az utasítást. Ha a feltétel továbbra is $true
fennáll, az Utasítás listában lévő parancsok újra futnak.
A ciklus addig ismétlődik, amíg a feltétel meg nem változik $false
.
Az Ismétlés helyőrző egy vagy több, vesszővel elválasztott parancsot jelöl, amelyet a rendszer minden alkalommal végrehajt, amikor a ciklus ismétlődik. Ez általában egy olyan változó módosítására szolgál, amely az utasítás Feltétel részén belül van tesztelve.
Az Utasításlista helyőrzője egy vagy több parancsot jelöl, amelyek minden alkalommal futnak, amikor a ciklus be van írva vagy ismétlődik. Az Utasításlista tartalmát kapcsos zárójelek veszik körül.
Több művelet támogatása
Az Init utasításban több hozzárendelési művelet esetén az alábbi szintaxisok támogatottak:
# 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"
}
Az Ismétlés utasításban a következő szintaxisok támogatottak több hozzárendelési művelethez:
# 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"
}
Feljegyzés
Az előzetes és a utólagos növekménytől eltérő műveletek nem feltétlenül működnek az összes szintaxissal.
Több feltétel esetén használjon logikai operátorokat az alábbi példában bemutatott módon.
for (($i = 0), ($j = 0); $i -lt 10 -and $j -lt 10; $i++,$j++)
{
"`$i:$i"
"`$j:$j"
}
További információ: about_Logical_Operators.
Szintaxisbeli példák
Legalább egy For
utasításhoz szükség van az utasítás Init, Condition és Repeat részét körülvevő zárójelre, valamint egy kapcsos zárójelekkel körülvett parancsra az utasítás Utasításlista részén.
Vegye figyelembe, hogy a közelgő példák szándékosan jelenítik meg a kódot az For
utasításon kívül. A későbbi példákban a kód integrálva lesz az For
utasításba.
Az alábbi For
utasítás például folyamatosan megjeleníti a változó értékét $i
, amíg manuálisan nem bontja ki a parancsot a CTRL+C billentyűkombináció lenyomásával.
$i = 1
for (;;)
{
Write-Host $i
}
További parancsokat is hozzáadhat az utasításlistához, hogy a ciklus minden futtatásakor 1-zel nőjön az érték $i
, ahogy az az alábbi példában is látható.
for (;;)
{
$i++; Write-Host $i
}
Amíg a CTRL+C billentyűkombinációval nem lép ki a parancsból, ez az utasítás folyamatosan megjeleníti a $i
változó értékét, mivel a ciklus minden futtatásakor 1-zel növekszik.
Ahelyett, hogy az utasítás utasításlista részén módosítanák For
a változó értékét, az utasítás Ismétlés részét használhatja az For
alábbiak szerint.
$i=1
for (;;$i++)
{
Write-Host $i
}
Ez az utasítás továbbra is határozatlan ideig ismétlődik, amíg ki nem lép a parancsból a CTRL+C billentyűkombináció lenyomásával.
A ciklust For
egy feltétel használatával is megszakíthatja. A feltételt az utasítás Feltétel részének használatával helyezheti el For
. A For
ciklus akkor fejeződik be, amikor a feltétel kiértékeli a következőt $false
: .
Az alábbi példában a For
hurok 10-nél kisebb vagy egyenlő érték $i
mellett fut.
$i=1
for(;$i -le 10;$i++)
{
Write-Host $i
}
A változó utasításon kívüli For
létrehozása és inicializálása helyett ezt a feladatot a For
cikluson belül hajthatja végre az utasítás Init részének For
használatával.
for($i=1; $i -le 10; $i++){Write-Host $i}
Pontosvesszők helyett kocsivisszajeleket is használhat az utasítás Init, Condition és Repeat részeinek For
elválasztásához. Az alábbi példa ezt az alternatív szintaxist For
használja.
for ($i = 0
$i -lt 10
$i++){
$i
}
Az utasítás ezen alternatív formája PowerShell-szkriptfájlokban For
és a PowerShell parancssorában működik. Az utasítás szintaxisa azonban könnyebben használható For
pontosvesszővel, amikor interaktív parancsokat ad meg a parancssorban.
A For
hurok rugalmasabb, mint a Foreach
hurok, mivel lehetővé teszi egy tömb vagy gyűjtemény értékeinek növelését minták használatával. Az alábbi példában a $i
változó 2-zel növekszik az utasítás Ismétlés részében For
.
for ($i = 0; $i -le 20; $i += 2)
{
Write-Host $i
}
A For
hurok egy sorra is írható, ahogy az alábbi példában is látható.
for ($i = 0; $i -lt 10; $i++) { Write-Host $i }
Funkcionális példa
Az alábbi példa bemutatja, hogyan használhat hurkot For
egy fájltömb iterálására és átnevezésére. A mappában lévő work_items
fájlok fájlneve a munkaelem-azonosítójuk. A hurok végighalad a fájlokon, hogy az azonosítószám nulla legyen öt számjegyre állítva.
Először a kód lekéri a munkaelem-adatfájlok listáját. Ezek mind olyan JSON-fájlok, amelyek a nevük formátumát <work-item-type>-<work-item-number>
használják.
A változóba $fileList
mentett fájlinformációs objektumokkal név szerint rendezheti őket, és láthatja, hogy míg az elemek típus szerint vannak csoportosítva, az elemek azonosító szerinti sorrendje váratlan.
$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
Annak érdekében, hogy a munkaelemeket alfanumerikusan rendezhesse, a munkaelemszámokat nullával kell elválasztani.
A kód ezt úgy teszi meg, hogy először megkeresi a leghosszabb numerikus utótaggal rendelkező munkaelemet. Hurkot használ for
a fájlok felett, és az index használatával éri el a tömb egyes fájljait. Az egyes fájlneveket egy reguláris kifejezésmintával hasonlítja össze, így a munkaelem számát sztringként nyeri ki egész szám helyett. Ezután összehasonlítja a munkaelem-számok hosszát a leghosszabb szám megtalálásához.
# 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
}
}
}
Most, hogy megismerte a munkaelemek maximális számának számát, szükség szerint átküldheti a fájlokat az átnevezéshez. A kód következő kódrészlete ismét átkerül a fájllistára, és szükség szerint betömi őket. Egy másik reguláris kifejezésmintát használ, amely csak a maximálisnál kisebb számszámú fájlokat dolgozza fel.
# 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
}
A fájlok átnevezése után újra lekérheti a fájlok listáját, és név szerint rendezheti a régi és az új fájlokat is. Az alábbi kódrészlet ismét lekéri a fájlokat egy új tömbbe való mentéshez, és összehasonlítja a kezdeti objektumkészlettel. Ezután mindkét fájltömböt rendezi, és menti a rendezett tömböket az új változókba $sortedOriginal
és $sortedPadded
a . Végül egy hurkot for
használ a tömbök iterálásához, és a következő tulajdonságokkal rendelkező objektumot ad ki:
- Az index a rendezett tömbök aktuális indexét jelöli.
- Az eredeti az aktuális index eredeti fájlneveinek rendezett tömbjében található elem.
- A kipárnázott elem az aktuális indexben a kipárnázott fájlnevek rendezett tömbjében található elem.
$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
A kimenetben a kitöltés utáni rendezett munkaelemek a várt sorrendben vannak.