Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Kurzbeschreibung
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 zum Erstellen einer Schleife. Diese Schleife führt Befehle in einem Befehlsblock aus, während eine angegebene Bedingung als $true ausgewertet wird.
Eine typische Verwendung der for-Schleife ist, ein Array von Werten zu iterieren und mit einer Teilmenge dieser Werte zu arbeiten. In den meisten Fällen sollten Sie eine foreach-Anweisung verwenden, wenn Sie alle Werte in einem Array iterieren möchten.
Syntax
Unten wird die Syntax der for-Anweisung angezeigt.
for (<Init>; <Condition>; <Repeat>)
{
<Statement list>
}
Der Platzhalter Init 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 dabei die Grundlage für die Bedingung, die im folgenden Abschnitt der for-Anweisung getestet werden soll.
Der Platzhalter Condition repräsentiert den Teil der for-Aussage, der zu einem $true oder $falsebooleschen Wert aufgelöst wird. PowerShell wertet die Bedingung jedes Mal aus, wenn die for-Schleife durchlaufen wird. Wenn die Anweisung $trueist, werden die Befehle im Befehlsblock ausgeführt, und die Anweisung wird erneut ausgewertet. Wenn die Bedingung noch $true ist, werden die Befehle in der Statement list (Anweisungsliste) erneut ausgeführt.
Die Schleife wird wiederholt, bis die Bedingung den Wert $false hat.
Der Platzhalter Repeat stellt eine oder mehrere Anweisungen dar, die durch Kommas getrennt sind und jedes Mal ausgeführt werden, wenn die Schleife erneut durchlaufen wird. In der Regel wird er verwendet, um eine Variable zu ändern, die innerhalb des Condition-Teils der Anweisung getestet wird.
Der Statement list-Platzhalter stellt einen Satz von einem oder mehreren Befehlen dar, die jedes Mal ausgeführt werden, wenn die Schleife gestartet oder wiederholt wird. Der Inhalt des Platzhalters Statement list ist in geschweiften Klammern eingeschlossen.
Unterstützung für mehrere Operationen
Die folgenden Syntaxen werden für mehrere Zuweisungsvorgä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 Zuweisungsvorgä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"
}
Anmerkung
Andere Vorgänge als Vor- und Postinkrement-Operationen funktionieren möglicherweise nicht in allen Syntaxen.
Verwenden Sie für mehrere Conditions (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 eine for-Anweisung erfordert Klammern um den Init-, Condition- und Repeat-Teil der Anweisung sowie einen in geschweiften Klammern eingeschlossenen Befehl im Statement list-Teil der Anweisung.
Beachten Sie, dass in den anstehenden Beispielen absichtlich Code außerhalb der for-Anweisung angezeigt wird. In späteren Beispielen wird Code in die for-Anweisung integriert.
Beispielsweise zeigt die folgende for-Anweisung kontinuierlich den Wert der $i-Variable an, bis Sie den Befehl manuell beenden, 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 von $i bei jeder Ausführung der Schleife um 1 erhöht wird, wie im folgenden Beispiel veranschaulicht.
for (;;)
{
$i++; Write-Host $i
}
Bis Sie den Befehl durch Drücken von STRG+C unterbrechen, zeigt diese Anweisung kontinuierlich den Wert der Variablen $i an, weil sie bei jeder Ausführung der Schleife um 1 erhöht wird.
Anstatt den Wert der Variablen im Teil mit der Anweisungsliste 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 unendlich wiederholt, bis Sie den Befehl unterbrechen, indem Sie STRG+C drücken.
Sie können die for-Schleife mit einer Bedingung beenden. Sie können eine Bedingung mithilfe des Abschnitts Condition der for-Anweisung anwenden. Die for-Schleife wird beendet, wenn die Auswertung der Bedingung $false ergibt.
Im folgenden Beispiel läuft die for-Schleife, solange der Wert von $i kleiner 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 ausführen, indem Sie den Init Teil der for-Anweisung verwenden.
for($i=1; $i -le 10; $i++){Write-Host $i}
Sie können Zeilenvorschübe anstelle von Semikolons verwenden, um die Abschnitte Init, Condition und Repeat der for-Anweisung zu trennen. Das folgende Beispiel zeigt eine for-Methode, die diese Syntax verwendet:
for ($i = 0
$i -lt 10
$i++){
$i
}
Diese alternative Form der for-Anweisung funktioniert in PowerShell-Skriptdateien und in der PowerShell-Befehlszeile. Es ist jedoch einfacher, die Syntax der for-Anweisung mit Semikolons zu verwenden, wenn Sie interaktive Befehle an der Eingabeaufforderung eingeben.
Die for Schleife ist flexibler als die foreach Schleife, da sie es Ihnen ermöglicht, Werte in einem Array oder einer Auflistung mithilfe von Mustern zu erhöhen. Im folgenden Beispiel wird die $i-Variable im Repeat-Teil der for-Anweisung um 2 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 veranschaulicht.
for ($i = 0; $i -lt 10; $i++){Write-Host $i}
Funktionales Beispiel
Im folgenden Beispiel wird veranschaulicht, wie Sie eine for-Schleife verwenden können, um ein Array von Dateien zu durchlaufen und umzubenennen. Die Dateien im ordner work_items haben ihre Arbeitselement-ID als Dateinamen. Die Schleife iteriert die Dateien, um sicherzustellen, dass die ID-Nummer auf fünf Stellen mit Nullen aufgefüllt ist.
Zuerst ruft der Code die Liste der Arbeitsobjektdatendateien ab. Sie sind alle JSON-Dateien, die das Format <work-item-type>-<work-item-number> für ihren Namen verwenden.
Wenn die Dateiinfoobjekte in der Variablen $fileList gespeichert sind, können Sie sie nach Namen sortieren und sehen, dass die Elemente zwar nach Typ gruppiert werden, die Sortierung der Elemente nach ID jedoch 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 Arbeitselemente alphanumerisch sortieren können, müssen die Arbeitselementnummern mit Nullen aufgefüllt werden.
Der Code führt diese Aufgabe aus, indem zuerst nach dem Arbeitselement mit dem längsten numerischen Suffix gesucht wird. Sie durchläuft die Dateien mithilfe einer for-Schleife und verwendet den Index, um auf jede Datei im Array zuzugreifen. Sie vergleicht jeden Dateinamen mit einem regulären Ausdrucksmuster, um die Arbeitselementnummer als Zeichenfolge anstelle einer ganzen Zahl zu extrahieren. Anschließend werden die Längen der Arbeitselementnummern verglichen, um die längste Nummer 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 Ziffernzählung für die Arbeitsaufgaben kennen, können Sie die Dateien durchlaufen, um sie bei Bedarf umzubenennen. Der nächste Codeausschnitt durchläuft die Dateiliste erneut, wobei die Nummern je nach Bedarf aufgefüllt werden. Er 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 und die sortierten Arrays in den neuen Variablen $sortedOriginal und $sortedPaddedgespeichert. Schließlich wird eine for-Schleife verwendet, um die Arrays zu durchlaufen und ein Objekt mit 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.
- Padded ist das Element im sortierten Array der aufgefüllten Dateinamen an der aktuellen Indexposition.
$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 Arbeitselemente nach dem Auffüllen in der erwarteten Reihenfolge.