수색…
소개
루프는 특정 조건에 도달 할 때까지 계속 반복되는 일련의 명령어입니다. 프로그램에서 반복적으로 코드 블록을 실행할 수있게하는 것이 프로그래밍에서 가장 기본이지만 유용한 작업 중 하나입니다. 루프를 사용하면 매우 단순한 명령문을 작성하여 반복적으로보다 큰 결과를 얻을 수 있습니다. 조건에 도달하면 다음 명령어는 다음 순차 명령어로 넘어가거나 루프 외부로 분기됩니다.
통사론
(<Initialization>, <Condition>, <Repetition>) {<Script_Block>}
<컬렉션> | Foreach-Object {<Script_Block_with _ $ __ as_current_item>}
foreach (<Collection>의 <Item>) {<Script_Block>}
while (<조건>) {<Script_Block>}
while (<Condition>) while {<Script_Block>}
(<Condition>)까지 {{Script_Block>}을 (를) 수행하십시오
<Collection> .foreach ({<Script_Block_with _ $ __ as_current_item>})
비고
각각
PowerShell에서 foreach 루프를 실행하는 방법은 여러 가지가 있으며 장점과 단점이 있습니다.
해결책 | 장점 | 단점 |
---|---|---|
Foreach 문 | 가장 빠릅니다. 정적 컬렉션 (변수에 저장 됨)에서 가장 잘 작동합니다. | 파이프 라인 입력 또는 출력 없음 |
ForEach () 메서드 | Foreach-Object 와 동일한 스크립트 블럭 구문이지만 빠릅니다. 정적 컬렉션 (변수에 저장 됨)에서 가장 잘 작동합니다. 파이프 라인 출력을 지원합니다. | 파이프 라인 입력을 지원하지 않습니다. PowerShell 4.0 이상 필요 |
Foreach-Object (cmdlet) | 파이프 라인 입출력을 지원합니다. 연결의 초기화 및 종료 등을위한 시작 및 종료 스크립트 블록 지원. 가장 유연한 솔루션. | 가장 느린 |
공연
$foreach = Measure-Command { foreach ($i in (1..1000000)) { $i * $i } }
$foreachmethod = Measure-Command { (1..1000000).ForEach{ $_ * $_ } }
$foreachobject = Measure-Command { (1..1000000) | ForEach-Object { $_ * $_ } }
"Foreach: $($foreach.TotalSeconds)"
"Foreach method: $($foreachmethod.TotalSeconds)"
"ForEach-Object: $($foreachobject.TotalSeconds)"
Example output:
Foreach: 1.9039875
Foreach method: 4.7559563
ForEach-Object: 10.7543821
Foreach-Object
가 가장 느리지 만 파이프 라인 지원은 파일을 읽거나 데이터를받는 동안 도착할 때 항목을 처리 할 수 있으므로 유용 할 수 있습니다. 처리하기 전에 모든 데이터를 메모리에로드 할 필요가 없으므로 큰 데이터와 낮은 메모리로 작업 할 때 매우 유용 할 수 있습니다.
에 대한
for($i = 0; $i -le 5; $i++){
"$i"
}
for 루프의 일반적인 용도는 배열에있는 값의 하위 집합에서 작동하는 것입니다. 대부분의 경우 배열의 모든 값을 반복하려면 foreach 문을 사용하는 것이 좋습니다.
각각
ForEach
는 PowerShell에서 두 가지 의미를 가지고 있습니다. 하나는 키워드 이고 다른 하나는 ForEach-Object cmdlet의 별칭입니다. 전자는 여기에 설명되어 있습니다.
이 예는 어레이의 모든 항목을 콘솔 호스트에 인쇄하는 방법을 보여줍니다.
$Names = @('Amy', 'Bob', 'Celine', 'David')
ForEach ($Name in $Names)
{
Write-Host "Hi, my name is $Name!"
}
이 예제는 ForEach 루프 출력을 캡처하는 방법을 보여줍니다.
$Numbers = ForEach ($Number in 1..20) {
$Number # Alternatively, Write-Output $Number
}
마지막 예제와 마찬가지로이 예제는 대신 루프를 저장하기 전에 배열을 만드는 방법을 보여줍니다.
$Numbers = @()
ForEach ($Number in 1..20)
{
$Numbers += $Number
}
동안
while 루프는 조건을 평가하고 참이면 조치를 수행합니다. 조건이 참으로 평가되는 한 조치는 계속 수행됩니다.
while(condition){
code_block
}
다음 예제에서는 10에서 0으로 계산되는 루프를 만듭니다.
$i = 10
while($i -ge 0){
$i
$i--
}
Do
While 루프와 달리 조건은 작업의 첫 번째 실행 전에 평가됩니다. 초기 조건이 거짓으로 평가되면 작업이 수행되지 않습니다.
참고 : 조건을 평가할 때 PowerShell은 반환 개체의 존재를 true로 처리합니다. 이것은 여러 가지 방법으로 사용될 수 있지만 아래는 프로세스를 모니터링하는 예제입니다. 이 예제는 메모장 프로세스를 생성 한 다음 해당 프로세스가 실행중인 동안 현재 쉘을 잠자기 상태로 만듭니다. 메모장 인스턴스를 수동으로 닫으면 while 조건이 실패하고 루프가 중단됩니다.
Start-Process notepad.exe
while(Get-Process notepad -ErrorAction SilentlyContinue){
Start-Sleep -Milliseconds 500
}
ForEach-Object
ForEach-Object
cmdlet은 foreach
문과 유사하게 작동하지만 파이프 라인에서 입력을받습니다.
기본 사용법
$object | ForEach-Object {
code_block
}
예:
$names = @("Any","Bob","Celine","David")
$names | ForEach-Object {
"Hi, my name is $_!"
}
Foreach-Object
에는 두 개의 기본 별칭 foreach
와 %
(약식 구문)가 있습니다. 대부분의 일반적인 %
때문에 foreach
와 혼동 될 수 foreach 문 . 예 :
$names | % {
"Hi, my name is $_!"
}
$names | foreach {
"Hi, my name is $_!"
}
고급 사용법
Foreach-Object
는 파이프 라인을 사용하도록 설계된 cmdlet이기 때문에 다른 foreach
솔루션보다 두드러집니다. 이 때문에 cmdlet 또는 고급 기능처럼 세 가지 스크립트 블록을 지원합니다.
- 시작 : 파이프 라인에서 도착한 항목을 반복하기 전에 한 번 실행됩니다. 일반적으로 루프에서 사용하기위한 함수를 생성하고, 변수를 생성하고, 연결을 여는 데 사용됩니다 (데이터베이스, 웹 + 등).
- 프로세스 : 파이프 라인에서 도착한 항목 당 한 번 실행됩니다. "보통"foreach 코드 블럭. 이것은 매개 변수가 지정되지 않은 경우 위의 예에서 사용 된 기본값입니다.
- End : 모든 항목을 처리 한 후 한 번 실행됩니다. 일반적으로 연결을 닫고 보고서를 생성하는 데 사용됩니다.
예:
"Any","Bob","Celine","David" | ForEach-Object -Begin {
$results = @()
} -Process {
#Create and store message
$results += "Hi, my name is $_!"
} -End {
#Count messages and output
Write-Host "Total messages: $($results.Count)"
$results
}
해야 할 것
Do-loops는 항상 적어도 한 번 코드 블록을 실행하려는 경우에 유용합니다. Do-loop는 코드 블록을 실행하기 전에 수행하는 while 루프와 달리 코드 블록을 실행 한 후 조건을 평가합니다.
do-loops는 두 가지 방법으로 사용할 수 있습니다.
조건이 참일 때 루프 :
Do { code_block } while (condition)
조건이 참이 될 때까지 반복합니다. 즉 조건이 거짓 인 동안 루프를 반복합니다.
Do { code_block } until (condition)
실제 예 :
$i = 0
Do {
$i++
"Number $i"
} while ($i -ne 3)
Do {
$i++
"Number $i"
} until ($i -eq 3)
Do-While과 Do-Until은 antonymous loops입니다. 같은 코드 안에 있으면 조건이 바뀝니다. 위의 예는이 동작을 보여줍니다.
ForEach () 메서드
ForEach-Object
cmdlet 대신 여기에서 ForEach
메서드를 개체 배열에 직접 사용할 수도 있습니다
(1..10).ForEach({$_ * $_})
또는 - 원하는 경우 스크립트 블록 주변의 괄호를 생략 할 수 있습니다.
(1..10).ForEach{$_ * $_}
두 가지 모두 아래 출력이됩니다.
1
4
9
16
25
36
49
64
81
100
잇다
Continue
연산자는 For
, ForEach
, While
및 Do
루프에서 작동합니다. 루프의 현재 반복을 건너 뛰고 가장 안쪽 루프의 맨 위로 이동합니다.
$i =0
while ($i -lt 20) {
$i++
if ($i -eq 7) { continue }
Write-Host $I
}
위의 내용은 콘솔에 1에서 20까지 출력되지만 숫자 7은 놓치게됩니다.
참고 : 파이프 라인 루프를 사용할 때는 Continue
대신 return
을 사용해야합니다.
단절
break
연산자는 프로그램 루프를 즉시 종료합니다. For
, ForEach
, While
및 Do
루프 또는 Switch
문에서 사용할 수 있습니다.
$i = 0
while ($i -lt 15) {
$i++
if ($i -eq 7) {break}
Write-Host $i
}
위의 값은 15로 계산되지만 7에 도달하자마자 멈 춥니 다.
참고 : 파이프 라인 루프를 사용할 때 break
는 continue
작동합니다. 파이프 라인 루프의 break
을 시뮬레이션하려면 몇 가지 추가 로직, cmdlet 등을 통합해야합니다. break
을 사용해야하는 경우 비 파이프 라인 루프를 사용하는 것이 더 쉽습니다.
라벨 끊기
Break는 루프의 인스턴스화 앞에 놓인 레이블을 호출 할 수도 있습니다.
$i = 0
:mainLoop While ($i -lt 15) {
Write-Host $i -ForegroundColor 'Cyan'
$j = 0
While ($j -lt 15) {
Write-Host $j -ForegroundColor 'Magenta'
$k = $i*$j
Write-Host $k -ForegroundColor 'Green'
if ($k -gt 100) {
break mainLoop
}
$j++
}
$i++
}
참고 : 이 코드는 $i
를 8
, $j
를 13
증가시켜 $k
가 104
합니다. $k
가 100
초과하면 코드가 두 루프에서 빠져 나옵니다.