Delen via


about_For

Korte beschrijving

Beschrijft een taalopdracht die u kunt gebruiken om instructies uit te voeren op basis van een voorwaardelijke test.

Lange beschrijving

De for-instructie (ook wel bekend als een for-lus) is een taalconstructie die u kunt gebruiken om een lus te maken waarmee opdrachten in een opdrachtblok worden uitgevoerd terwijl een opgegeven voorwaarde resulteert in $true.

Een typisch gebruik van de for lus is het herhalen van een matrix met waarden en het uitvoeren van een subset van deze waarden. Als u in de meeste gevallen alle waarden in een matrix wilt herhalen, kunt u overwegen een foreach instructie te gebruiken.

Syntaxis

Hieronder ziet u de syntaxis van de for instructie.

for (<Init>; <Condition>; <Repeat>)
{
    <Statement list>
}

De tijdelijke aanduiding Init vertegenwoordigt een of meer opdrachten die worden uitgevoerd voordat de lus begint. Doorgaans gebruikt u het Init- gedeelte van de instructie om een variabele met een beginwaarde te maken en te initialiseren.

Deze variabele is vervolgens de basis voor de voorwaarde die moet worden getest in het volgende gedeelte van de for-instructie.

De tijdelijke aanduiding Voorwaarde vertegenwoordigt het gedeelte van de for-instructie dat wordt omgezet in een $true of $falseBooleaanse-waarde. PowerShell evalueert de voorwaarde telkens wanneer de for lus wordt uitgevoerd. Als de instructie is $true, worden de opdrachten in het opdrachtblok uitgevoerd en wordt de instructie opnieuw geëvalueerd. Als de voorwaarde nog steeds $true, worden de opdrachten in de lijst met -instructies opnieuw uitgevoerd uitgevoerd. De lus wordt herhaald totdat de voorwaarde $falsewordt.

De tijdelijke aanduiding Herhalen vertegenwoordigt een of meer opdrachten, gescheiden door komma's, die telkens worden uitgevoerd wanneer de lus wordt herhaald. Dit wordt meestal gebruikt om een variabele te wijzigen die wordt getest in de Voorwaarde deel van de instructie.

De instructielijst tijdelijke aanduiding vertegenwoordigt een set van een of meer opdrachten die worden uitgevoerd telkens wanneer de lus wordt ingevoerd of herhaald. De inhoud van de lijst met -instructies wordt omgeven door accolades.

Ondersteuning voor meerdere bewerkingen

De volgende syntaxis wordt ondersteund voor meerdere toewijzingsbewerkingen in de instructie Init:

# 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"
}

De volgende syntaxis wordt ondersteund voor meerdere toewijzingsbewerkingen in de instructie Repeat:

# 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"
}

Notitie

Bewerkingen die niet vooraf of na incrementeel zijn, werken mogelijk niet met alle syntaxis.

Voor meerdere Voorwaarden logische operatoren gebruiken, zoals in het volgende voorbeeld wordt gedemonstreerd.

for (($i = 0), ($j = 0); $i -lt 10 -and $j -lt 10; $i++,$j++)
{
    "`$i:$i"
    "`$j:$j"
}

Zie about_Logical_Operatorsvoor meer informatie.

Voorbeelden van syntaxis

Een for instructie vereist minimaal het haakje rond de Init, Voorwaardeen Deel van de instructie herhalen en een opdracht tussen accolades in de lijst instructie deel van de instructie herhalen.

Houd er rekening mee dat in de komende voorbeelden opzettelijk code wordt weergegeven buiten de for-instructie. In latere voorbeelden wordt code geïntegreerd in de for-instructie.

De volgende for instructie geeft bijvoorbeeld voortdurend de waarde van de $i variabele weer totdat u de opdracht handmatig uitbreekt door op Ctrl+C te drukken.

$i = 1
for (;;)
{
    Write-Host $i
}

U kunt extra opdrachten toevoegen aan de lijst met instructies, zodat de waarde van $i steeds met 1 wordt verhoogd wanneer de lus wordt uitgevoerd, zoals in het volgende voorbeeld wordt weergegeven.

for (;;)
{
    $i++; Write-Host $i
}

Totdat u de opdracht uitbreekt door op Ctrl+C te drukken, wordt met deze instructie voortdurend de waarde van de $i variabele weergegeven, omdat deze met 1 wordt verhoogd telkens wanneer de lus wordt uitgevoerd.

In plaats van de waarde van de variabele in het overzichtslijstgedeelte van de for-instructie te wijzigen, kunt u in plaats daarvan het gedeelte van de for-instructie herhalen als volgt gebruiken.

$i=1
for (;;$i++)
{
    Write-Host $i
}

Deze instructie wordt nog steeds voor onbepaalde tijd herhaald totdat u de opdracht uitbreekt door op Ctrl+C te drukken.

U kunt de for lus beëindigen met behulp van een voorwaarde. U kunt een voorwaarde plaatsen met behulp van het Voorwaarde gedeelte van de instructie for. De for lus wordt beëindigd wanneer de voorwaarde resulteert in $false.

In het volgende voorbeeld wordt de for lus uitgevoerd terwijl de waarde van $i kleiner is dan of gelijk is aan 10.

$i=1
for(;$i -le 10;$i++)
{
    Write-Host $i
}

In plaats van de variabele buiten de instructie for te maken en te initialiseren, kunt u deze taak binnen de for lus uitvoeren met behulp van het Init- gedeelte van de for-instructie.

for($i=1; $i -le 10; $i++){Write-Host $i}

U kunt regelterugloop gebruiken in plaats van puntkomma's om de Init-, Voorwaardete scheiden en gedeelten van de for-instructie herhalen. In het volgende voorbeeld ziet u een for die gebruikmaakt van deze alternatieve syntaxis.

for ($i = 0
  $i -lt 10
  $i++){
  $i
}

Deze alternatieve vorm van de for-instructie werkt in PowerShell-scriptbestanden en bij de PowerShell-opdrachtprompt. Het is echter eenvoudiger om de syntaxis van de for instructie met puntkomma's te gebruiken wanneer u interactieve opdrachten invoert bij de opdrachtprompt.

De for lus is flexibeler dan de foreach lus, omdat u hiermee waarden in een matrix of verzameling kunt verhogen met behulp van patronen. In het volgende voorbeeld wordt de variabele $i verhoogd met 2 in het Herhaal gedeelte van de instructie for.

for ($i = 0; $i -le 20; $i += 2)
{
    Write-Host $i
}

De for-lus kan ook op één regel worden geschreven, zoals in het volgende voorbeeld.

for ($i = 0; $i -lt 10; $i++){Write-Host $i}

Functioneel voorbeeld

In het volgende voorbeeld ziet u hoe u een for lus kunt gebruiken om een matrix met bestanden te herhalen en de naam ervan te wijzigen. De bestanden in de map work_items hebben hun werkitem-id als bestandsnaam. De lus doorloopt de bestanden om ervoor te zorgen dat het id-nummer nul is opgevuld tot vijf cijfers.

Eerst haalt de code de lijst met gegevensbestanden van werkitems op. Het zijn alle JSON-bestanden die de indeling gebruiken <work-item-type>-<work-item-number> voor hun naam. Wanneer de bestandsinformatieobjecten zijn opgeslagen in de variabele $fileList, kunt u ze sorteren op naam en zien dat de volgorde van de items op id onverwacht is terwijl items zijn gegroepeerd op type.

$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

Om ervoor te zorgen dat u de werkitems alfanumerisch kunt sorteren, moeten de werkitemnummers nul worden opgevuld.

De code doet dit door eerst te zoeken naar het werkitem met het langste numerieke achtervoegsel. Het lust over de bestanden met behulp van een for lus, met behulp van de index voor toegang tot elk bestand in de matrix. Elke bestandsnaam wordt vergeleken met een patroon voor een reguliere expressie om het werkitemnummer te extraheren als een tekenreeks in plaats van een geheel getal. Vervolgens worden de lengten van de werkitemnummers vergeleken om het langste getal te vinden.

# 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
        }
    }
}

Nu u het maximumaantal cijfers voor de werkitems kent, kunt u de bestanden herhalen om ze zo nodig te hernoemen. Het volgende codefragment doorloopt de bestandslijst opnieuw, waardoor deze indien nodig worden opgeslagen. Er wordt een ander patroon voor reguliere expressies gebruikt om alleen bestanden te verwerken met een numeriek aantal dat kleiner is dan het 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
}

Nu de naam van de bestanden is gewijzigd, kunt u de lijst met bestanden opnieuw ophalen en zowel de oude als de nieuwe bestanden sorteren op naam. Met het volgende codefragment worden de bestanden opnieuw opgehaald om op te slaan in een nieuwe matrix en te vergelijken met de eerste set objecten. Vervolgens worden beide matrices met bestanden gesorteerd en worden de gesorteerde matrices opgeslagen in de nieuwe variabelen $sortedOriginal en $sortedPadded. Ten slotte wordt een for lus gebruikt om de matrices te herhalen en een object uit te voeren met de volgende eigenschappen:

  • Index vertegenwoordigt de huidige index in de gesorteerde matrices.
  • Oorspronkelijke is het item in de gesorteerde matrix met oorspronkelijke bestandsnamen in de huidige index.
  • Opgevulde is het item in de gesorteerde matrix met opgevulde bestandsnamen in de huidige 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 de uitvoer bevinden de gesorteerde werkitems na opvulling zich in de verwachte volgorde.

Zie ook