Freigeben über


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 $truebesteht, 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.

Siehe auch