다음을 통해 공유


about_For

간단한 설명

조건부 테스트를 기반으로 문을 실행하는 데 사용할 수 있는 언어 명령에 대해 설명합니다.

자세한 설명

For 명령문(루프라고도 함For)은 지정된 조건이 계산되는 동안 명령 블록에서 명령을 실행하는 루프를 만드는 데 사용할 수 있는 언어 구문입니다$true.

루프의 For 일반적인 사용은 값 배열을 반복하고 이러한 값의 하위 집합에서 작동하는 것입니다. 대부분의 경우 배열의 모든 값을 반복하려면 문을 사용하는 것이 Foreach 좋습니다.

구문

다음은 문 구문을 보여줍니다 For .

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

Init 자리 표시자는 루프가 시작되기 전에 실행되는 하나 이상의 명령을 나타냅니다. 일반적으로 문의 Init 부분을 사용하여 시작 값으로 변수를 만들고 초기화합니다.

이 변수는 문의 다음 부분에서 테스트할 조건의 기초가 For 됩니다.

조건 자리 표시자는 또는 $false 부울 값으로 $true 확인되는 문의 부분을 For 나타냅니다. PowerShell은 루프가 실행될 때마다 For 조건을 평가합니다. 문이면 $true명령 블록의 명령이 실행되고 문이 다시 평가됩니다. 조건이 여전히 $true있으면 문 목록의 명령이 다시 실행됩니다. 루프는 조건이 될 때까지 반복됩니다.$false

반복 자리 표시자는 루프가 반복될 때마다 실행되는 하나 이상의 명령을 쉼표로 구분하여 나타냅니다. 일반적으로 문의 조건 부분 내에서 테스트되는 변수를 수정하는 데 사용됩니다.

문 목록 자리 표시자는 루프를 입력하거나 반복할 때마다 실행되는 하나 이상의 명령 집합을 나타냅니다. 문 목록내용은 중괄호로 묶입니다.

여러 작업에 대한 지원

다음 구문은 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"
}

다음 구문은 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"
}

참고 항목

사전 또는 사후 증분 이외의 작업은 모든 구문에서 작동하지 않을 수 있습니다.

여러 조건의 경우 다음 예제와 같이 논리 연산자를 사용합니다.

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

자세한 내용은 about_Logical_Operators 참조하세요.

구문 예제

최소한 문에는 For 문의 Init, Condition 및 Repeat 부분을 둘러싼 괄호와 문의 문 목록 부분에 중괄호로 둘러싸인 명령이 필요합니다.

예정된 예제는 의도적으로 문 외부의 코드를 표시합니다 For . 이후 예제에서는 코드가 문에 For 통합됩니다.

예를 들어 다음 문은 For Ctrl+C를 눌러 명령을 수동으로 분리할 때까지 변수 값을 $i 지속적으로 표시합니다.

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

다음 예제와 같이 루프가 실행될 때마다 값 $i 이 1씩 증가하도록 명령 목록에 명령을 추가할 수 있습니다.

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

Ctrl+C를 눌러 명령이 중단될 때까지 이 문은 루프가 실행될 때마다 1씩 증가하므로 변수 값을 $i 지속적으로 표시합니다.

문의 문 목록 부분에 For 있는 변수 값을 변경하는 대신 다음과 같이 문의 반복 부분을 For 사용할 수 있습니다.

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

이 문은 Ctrl+C를 눌러 명령에서 벗어날 때까지 무기한으로 반복됩니다.

조건을 사용하여 루프를 For 종료할 수 있습니다. 문의 조건 부분을 사용하여 조건을 배치할 For 수 있습니다. For 조건이 .로 계산되면 루프가 종료됩니다.$false

다음 예제에서는 값 $iFor 10보다 작거나 같은 동안 루프가 실행됩니다.

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

문 외부에서 For 변수를 만들고 초기화하는 대신 문의 Init 부분을 For 사용하여 루프 내에서 For 이 작업을 수행할 수 있습니다.

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

세미콜론 대신 캐리지 리턴을 사용하여 문의 Init, ConditionRepeat 부분을 구분할 수 있습니다For. 다음 예제에서는 이 대체 구문을 사용하는 방법을 보여줍니다 For .

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

이 대체 형식의 문은 For PowerShell 스크립트 파일 및 PowerShell 명령 프롬프트에서 작동합니다. 그러나 명령 프롬프트에서 For 대화형 명령을 입력할 때 세미콜론과 함께 문 구문을 사용하는 것이 더 쉽습니다.

For 루프는 패턴을 사용하여 배열 또는 컬렉션의 Foreach 값을 증분할 수 있으므로 루프보다 더 유연합니다. 다음 예제에서는 명령문의 $i 반복 부분에서 변수가 2씩 증가합니다For.

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

루프는 For 다음 예제와 같이 한 줄로 작성할 수도 있습니다.

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

기능 예제

다음 예제에서는 루프를 For 사용하여 파일 배열을 반복하고 이름을 바꾸는 방법을 보여 줍니다. 폴더의 work_items 파일에는 파일 이름으로 작업 항목 ID가 있습니다. 이 루프는 파일을 반복하여 ID 번호가 5자리 숫자로 채워지도록 합니다.

먼저 코드는 작업 항목 데이터 파일 목록을 검색합니다. 이름에 형식 <work-item-type>-<work-item-number> 을 사용하는 모든 JSON 파일입니다. 파일 정보 개체를 변수에 $fileList 저장하면 이름을 기준으로 정렬하고 항목이 형식별로 그룹화되는 동안 ID별로 항목의 순서가 예기치 않은지 확인할 수 있습니다.

$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

작업 항목을 영숫자로 정렬하려면 작업 항목 번호를 0으로 채워야 합니다.

코드는 먼저 가장 긴 숫자 접미사가 있는 작업 항목을 검색하여 이 작업을 수행합니다. 인덱스를 사용하여 배열의 각 파일에 액세스하는 루프를 사용하여 for 파일을 반복합니다. 각 파일 이름을 정규식 패턴과 비교하여 작업 항목 번호를 정수가 아닌 문자열로 추출합니다. 그런 다음 작업 항목 번호의 길이를 비교하여 가장 긴 숫자를 찾습니다.

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

이제 작업 항목의 최대 숫자 수를 확인했으므로 필요에 따라 파일을 반복하여 이름을 바꿀 수 있습니다. 다음 코드 조각은 파일 목록을 다시 반복하여 필요에 따라 패딩합니다. 또 다른 정규식 패턴을 사용하여 숫자 수가 최대값보다 작은 파일만 처리합니다.

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

이제 파일 이름이 바뀌었으므로 파일 목록을 다시 검색하고 이전 파일과 새 파일을 모두 이름으로 정렬할 수 있습니다. 다음 코드 조각은 파일을 다시 검색하여 새 배열에 저장하고 초기 개체 집합과 비교합니다. 그런 다음 정렬된 배열을 새 변수에 저장하고 $sortedPadded파일의 배열을 모두 정렬합니다$sortedOriginal. 마지막으로 루프를 for 사용하여 배열을 반복하고 다음 속성을 사용하여 개체를 출력합니다.

  • 인덱 스는 정렬된 배열의 현재 인덱스를 나타냅니다.
  • 원본 은 현재 인덱스에 있는 원래 파일 이름의 정렬된 배열에 있는 항목입니다.
  • Padded 는 현재 인덱스에 있는 패딩된 파일 이름의 정렬된 배열에 있는 항목입니다.
$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

출력에서 패딩 후 정렬된 작업 항목은 예상된 순서입니다.

참고 항목