수색…


소개

루프는 특정 조건에 도달 할 때까지 계속 반복되는 일련의 명령어입니다. 프로그램에서 반복적으로 코드 블록을 실행할 수있게하는 것이 프로그래밍에서 가장 기본이지만 유용한 작업 중 하나입니다. 루프를 사용하면 매우 단순한 명령문을 작성하여 반복적으로보다 큰 결과를 얻을 수 있습니다. 조건에 도달하면 다음 명령어는 다음 순차 명령어로 넘어가거나 루프 외부로 분기됩니다.

통사론

  • (<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 () 메서드

4.0

ForEach-Object cmdlet 대신 여기에서 ForEach 메서드를 개체 배열에 직접 사용할 수도 있습니다

(1..10).ForEach({$_ * $_})

또는 - 원하는 경우 스크립트 블록 주변의 괄호를 생략 할 수 있습니다.

(1..10).ForEach{$_ * $_}  

두 가지 모두 아래 출력이됩니다.

1
4
9
16
25
36
49
64
81
100  

잇다

Continue 연산자는 For , ForEach , WhileDo 루프에서 작동합니다. 루프의 현재 반복을 건너 뛰고 가장 안쪽 루프의 맨 위로 이동합니다.

$i =0
while ($i -lt 20) {
    $i++ 
    if ($i -eq 7) { continue }
    Write-Host $I
}

위의 내용은 콘솔에 1에서 20까지 출력되지만 숫자 7은 놓치게됩니다.

참고 : 파이프 라인 루프를 사용할 때는 Continue 대신 return 을 사용해야합니다.

단절

break 연산자는 프로그램 루프를 즉시 종료합니다. For , ForEach , WhileDo 루프 또는 Switch 문에서 사용할 수 있습니다.

$i = 0
while ($i -lt 15) {
    $i++ 
    if ($i -eq 7) {break}
    Write-Host $i
}

위의 값은 15로 계산되지만 7에 도달하자마자 멈 춥니 다.

참고 : 파이프 라인 루프를 사용할 때 breakcontinue 작동합니다. 파이프 라인 루프의 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++
}

참고 : 이 코드는 $i8 , $j13 증가시켜 $k104 합니다. $k100 초과하면 코드가 두 루프에서 빠져 나옵니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow