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
다음 예제에서는 값 $i
이 For
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, Condition 및 Repeat 부분을 구분할 수 있습니다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
출력에서 패딩 후 정렬된 작업 항목은 예상된 순서입니다.
참고 항목
PowerShell