about_For
Kurze Beschreibung
Beschreibt einen Sprachbefehl, den Sie zum Ausführen von Anweisungen basierend auf einem bedingten Test verwenden können.
Lange Beschreibung
Die For
Anweisung (auch als For
Schleife bezeichnet) ist ein Sprachkonstrukt, mit dem Sie eine Schleife erstellen können, die Befehle in einem Befehlsblock ausführt, während eine angegebene Bedingung ausgewertet wird $true
.
Eine typische Verwendung der For
Schleife besteht darin, ein Array von Werten zu durchlaufen und mit einer Teilmenge dieser Werte zu arbeiten. Wenn Sie in den meisten Fällen alle Werte in einem Array durchlaufen möchten, sollten Sie eine Foreach
Anweisung verwenden.
Syntax
Im Folgenden wird die For
Anweisungssyntax gezeigt.
for (<Init>; <Condition>; <Repeat>)
{
<Statement list>
}
Der Init-Platzhalter stellt einen oder mehrere Befehle dar, die ausgeführt werden, bevor die Schleife beginnt. In der Regel verwenden Sie den Init-Teil der Anweisung, um eine Variable mit einem Anfangswert zu erstellen und zu initialisieren.
Diese Variable ist dann die Basis für die Zu testende Bedingung im nächsten Teil der For
Anweisung.
Der Platzhalter "Condition" stellt den Teil der Anweisung dar, der For
in einen oder $false
einen $true
booleschen Wert aufgelöst wird. PowerShell wertet die Bedingung bei jeder Ausführung der For
Schleife aus. Wenn die Anweisung lautet $true
, werden die Befehle im Befehlsblock ausgeführt, und die Anweisung wird erneut ausgewertet. Wenn die Bedingung noch $true
besteht, werden die Befehle in der Anweisungsliste erneut ausgeführt.
Die Schleife wird wiederholt, bis die Bedingung wird $false
.
Der Platzhalter "Wiederholen " stellt einen oder mehrere Befehle dar, getrennt durch Kommas, die jedes Mal ausgeführt werden, wenn die Schleife wiederholt wird. In der Regel wird dies verwendet, um eine Variable zu ändern, die innerhalb des Condition-Teils der Anweisung getestet wird.
Der Platzhalter für die Anweisungsliste stellt einen Satz von mindestens einem Befehl dar, der jedes Mal ausgeführt wird, wenn die Schleife eingegeben oder wiederholt wird. Der Inhalt der Anweisungsliste ist von geschweiften Klammern umgeben.
Unterstützung für mehrere Vorgänge
Die folgenden Syntaxen werden für mehrere Zuordnungsvorgänge in der Init-Anweisung unterstützt:
# 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"
}
Die folgenden Syntaxen werden für mehrere Zuordnungsvorgänge in der Repeat-Anweisung unterstützt:
# 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"
}
Hinweis
Andere Vorgänge als vor oder nach dem Inkrement funktionieren möglicherweise nicht mit allen Syntaxen.
Verwenden Sie für mehrere Bedingungen logische Operatoren, wie im folgenden Beispiel veranschaulicht.
for (($i = 0), ($j = 0); $i -lt 10 -and $j -lt 10; $i++,$j++)
{
"`$i:$i"
"`$j:$j"
}
Weitere Informationen finden Sie unter about_Logical_Operators.
Syntaxbeispiele
Mindestens erfordert eine For
Anweisung die Klammer, die den Init-, Condition- und Repeat-Teil der Anweisung umgibt, und einen Befehl, der von geschweiften Klammern im Anweisungslistenteil der Anweisung umgeben ist.
Beachten Sie, dass in den anstehenden Beispielen absichtlich Code außerhalb der For
Anweisung angezeigt wird. In späteren Beispielen ist Code in die For
Anweisung integriert.
Die folgende For
Anweisung zeigt beispielsweise kontinuierlich den Wert der $i
Variablen an, bis Sie den Befehl manuell ausbrechen, indem Sie STRG+C drücken.
$i = 1
for (;;)
{
Write-Host $i
}
Sie können der Anweisungsliste zusätzliche Befehle hinzufügen, sodass der Wert der $i
Schleife bei jeder Ausführung der Schleife um 1 erhöht wird, wie im folgenden Beispiel gezeigt.
for (;;)
{
$i++; Write-Host $i
}
Bis Sie den Befehl durch Drücken von STRG+C aufheben, zeigt diese Anweisung kontinuierlich den Wert der $i
Variablen an, da sie bei jeder Ausführung der Schleife um 1 erhöht wird.
Anstatt den Wert der Variablen im Anweisungslistenteil der For
Anweisung zu ändern, können Sie stattdessen den Repeat-Teil der For
Anweisung wie folgt verwenden.
$i=1
for (;;$i++)
{
Write-Host $i
}
Diese Anweisung wird immer noch unbegrenzt wiederholt, bis Sie den Befehl aufheben, indem Sie STRG+C drücken.
Sie können die For
Schleife mit einer Bedingung beenden. Sie können eine Bedingung mithilfe des Bedingungsteils der For
Anweisung platzieren. Die For
Schleife wird beendet, wenn die Bedingung ausgewertet wird $false
.
Im folgenden Beispiel wird die For
Schleife ausgeführt, während der Wert kleiner $i
als oder gleich 10 ist.
$i=1
for(;$i -le 10;$i++)
{
Write-Host $i
}
Anstatt die Variable außerhalb der For
Anweisung zu erstellen und zu initialisieren, können Sie diese Aufgabe innerhalb der For
Schleife mithilfe des Init-Teils der For
Anweisung ausführen.
for($i=1; $i -le 10; $i++){Write-Host $i}
Sie können Wagenrücklaufs anstelle von Semikolons verwenden, um die Teile "Init", "Condition" und "Repeat " der For
Anweisung zu trennen. Das folgende Beispiel zeigt eine For
Syntax, die diese alternative Syntax verwendet.
for ($i = 0
$i -lt 10
$i++){
$i
}
Diese alternative Form der For
Anweisung funktioniert in PowerShell-Skriptdateien und an der PowerShell-Eingabeaufforderung. Es ist jedoch einfacher, die For
Anweisungssyntax mit Semikolons zu verwenden, wenn Sie interaktive Befehle an der Eingabeaufforderung eingeben.
Die For
Schleife ist flexibler als die Foreach
Schleife, da Sie Werte in einem Array oder einer Auflistung mithilfe von Mustern inkrementieren können. Im folgenden Beispiel wird die $i
Variable um 2 im Repeat-Teil der For
Anweisung erhöht.
for ($i = 0; $i -le 20; $i += 2)
{
Write-Host $i
}
Die For
Schleife kann auch in einer Zeile geschrieben werden, wie im folgenden Beispiel gezeigt.
for ($i = 0; $i -lt 10; $i++) { Write-Host $i }
Funktionales Beispiel
Das folgende Beispiel veranschaulicht, wie Sie eine For
Schleife verwenden können, um ein Array von Dateien zu durchlaufen und umzubenennen. Die Dateien im work_items
Ordner haben ihre Arbeitselement-ID als Dateinamen. Die Schleife durchläuft die Dateien, um sicherzustellen, dass die ID-Nummer auf fünf Stellen aufgefüllt wird.
Zuerst ruft der Code die Liste der Arbeitsaufgabendatendateien ab. Sie sind alle JSON-Dateien, die das Format <work-item-type>-<work-item-number>
für ihren Namen verwenden.
Wenn die Dateiinformationsobjekte in der $fileList
Variablen gespeichert sind, können Sie sie nach Namen sortieren und sehen, dass die Sortierung der Elemente nach Typ zwar nach Typ gruppiert wird, aber die Sortierung der Elemente nach ID unerwartet ist.
$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
Um sicherzustellen, dass Sie die Arbeitsaufgaben alphanumerisch sortieren können, müssen die Arbeitsaufgabennummern leer sein.
Der Code führt dies aus, indem zuerst nach der Arbeitsaufgabe mit dem längsten numerischen Suffix gesucht wird. Sie durchläuft die Dateien mithilfe einer for
Schleife mithilfe des Indexes, um auf jede Datei im Array zuzugreifen. Sie vergleicht jeden Dateinamen mit einem Muster eines regulären Ausdrucks, um die Arbeitselementnummer als Zeichenfolge anstelle einer ganzen Zahl zu extrahieren. Anschließend werden die Längen der Arbeitsaufgabennummern verglichen, um die längste Zahl zu finden.
# 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
}
}
}
Nachdem Sie nun die maximale Anzahl der Arbeitsaufgaben kennen, können Sie die Dateien durchlaufen, um sie nach Bedarf umzubenennen. Der nächste Codeausschnitt durchläuft die Dateiliste erneut, wobei sie nach Bedarf aufgefüllt werden. Es verwendet ein weiteres Muster für reguläre Ausdrücke, um Nur Dateien mit einer Anzahl von Zahlen zu verarbeiten, die kleiner als das Maximum sind.
# 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
}
Nachdem die Dateien umbenannt wurden, können Sie die Liste der Dateien erneut abrufen und sowohl die alten als auch die neuen Dateien nach Namen sortieren. Der folgende Codeausschnitt ruft die Dateien erneut ab, um in einem neuen Array zu speichern und mit dem anfänglichen Satz von Objekten zu vergleichen. Anschließend werden beide Arrays von Dateien sortiert, wobei die sortierten Arrays in den neuen Variablen $sortedOriginal
gespeichert werden.$sortedPadded
Schließlich wird eine for
Schleife verwendet, um die Arrays zu durchlaufen und ein Objekt mit den folgenden Eigenschaften auszugeben:
- Index stellt den aktuellen Index in den sortierten Arrays dar.
- Original ist das Element im sortierten Array der ursprünglichen Dateinamen im aktuellen Index.
- "Gepolstert " ist das Element im sortierten Array mit aufgefüllten Dateinamen im aktuellen Index.
$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
In der Ausgabe befinden sich die sortierten Arbeitsaufgaben nach dem Auffüllen in der erwarteten Reihenfolge.