PowerShell While Loop: 기본 안내서

PowerShell은 자동화 및 Windows 기반 시스템 관리를 위한 다양한 기능을 제공하는 강력한 스크립팅 언어입니다. 가장 일반적으로 사용되는 구조 중 하나는 PowerShell while 루프입니다.

PowerShell 스크립팅을 배우는 동안 끝없는 루프에 갇혔다면 걱정하지 마세요. PowerShell while 루프가 당신을 위대한 탈출로 안내할 것입니다. 이 튜토리얼에서는 스크립트를 작성하는 과정에서 PowerShell에서 while 루프를 기초로 돌아가 보겠습니다.

PowerShell 스크립팅 기술을 더욱 향상시키려면 계속 읽어보세요!

전제 조건

이 튜토리얼은 실습을 중심으로 진행됩니다. 함께 진행하려면 다음 사항이 준비되어 있는지 확인하세요:

  • A Windows machine – This tutorial uses Windows 10.
  • Windows PowerShell 5.0 이상이 설치되어 있어야 함 – 이 튜토리얼에서는 PowerShell 7을 사용합니다.
  • A user account with administrator privileges.

while 루프 단일 조건 실행

while 루프 중 가장 간단한 유형 중 하나는 단일 조건 유형입니다. If 문과 달리이 유형의 루프는 지정된 조건이 참으로 평가될 때까지 지정된 명령 세트를 실행합니다. ‘False’가 반환되면 루프가 종료되고 실행이 스크립트의 나머지 부분으로 계속됩니다.

아래는 단일 조건 while 루프의 구문입니다:

  • 먼저 괄호의 사용에 주목할 점입니다. 조건은 괄호 안에 포함되어야 하며, 코드 블록은 조건이 참인 동안 실행되는 PowerShell 명령어 집합입니다.
  • 두 번째로 주목할 점은 조건이 부울 값을 반환해야 하며, 이는 참 또는 거짓 중 하나로 평가됩니다.
while (condition)
{

	# 실행할 코드 블록

}

아래 코드를 실행합니다. 여기서 $val의 값은 0에서 시작하여 코드 블록이 실행될 때마다 1씩 증가하고, $val 변수의 값이 3과 같아질 때까지 계속됩니다.

$val3이 되면 조건이 거짓이 되어 루프가 중단되고 나머지 스크립트가 실행됩니다.

# 초기값이 0인 $val 변수 선언
$val = 0

# $val 변수의 값이 3이 될 때까지 while 루프 실행
while($val -ne 3)
{
	# $val 변수의 값을 1씩 증가시킴
	$val++
	
	# $val 변수의 현재 값 출력
	Write-Host $val
}
Understanding Single Condition While Loops.

내장 변수($true/$false)를 사용하여 PowerShell While 루프 실행

이전 예제에서 while 루프에서 조건을 사용하는 것은 잘 작동합니다. 그러나 $true$false와 같은 PowerShell의 내장 변수를 사용하여 While 루프를 만들 수도 있습니다.

아래 구문은 $true가 더 이상 $true가 아닐 때까지 실행됩니다. 다시 말해, 루프는 영원히 실행됩니다. 그러나 무한 루프에서 빠져 나올 수 있는 방법을 항상 포함해야 합니다. 그렇지 않으면 영원히 멈춰 있게 됩니다. 이 튜토리얼의 나중에 breakcontinue를 사용하여 루프에서 빠져 나오는 방법에 대해 더 배우게 될 것입니다.

while($true)
{

	# 실행할 코드 블록

}

아래의 코드 블록을 실행하면, $i의 값을 콘솔에 계속 출력하는 무한한 루프가 실행됩니다.

# 초기값이 0인 $i 변수를 선언합니다.
$i = 0

# 조건이 $true일 때까지 While 루프를 설정합니다.
while($true)
{
	# $i 값을 1씩 증가시킵니다.
	$i++
	
	# $i 변수의 현재 값 출력
	Write-Host $i
}

이제 루프를 빠져 나오려면 Ctrl+C를 누르십시오. 이 루프는 많은 시스템 리소스를 소비하므로 사용 시 주의하십시오.

Executing a while loop with PowerShell’s built-in ($true) variable

다중 조건 While 루프 실행

게다가 단일 조건 while 루프 외에도 다중 조건 while 루프를 생성할 수 있습니다. 단일 조건 While 루프와 마찬가지로 조건은 반드시 부울 값, 즉 True 또는 False를 반환해야 합니다.

아래는 다중 조건 while 루프의 구문입니다. 단일 조건 while 루프의 구문과 유사하지만 여러 조건을 다음 연산자로 구분하여 포함할 수 있습니다:

  • AND (-and) – 두 조건이 모두 참이어야 합니다.
  • OR (-or) (두 조건 중 하나가 참이어도 됨).
# AND 연산자
while (condition1 -AND condition2)
{

	# 실행할 코드 블록

}

# OR 연산자
while (condition1 -OR condition2)
{

	# 실행할 코드 블록

}

아래 코드를 실행하면 $val3이 아니고 (-ne) $i5가 아닌 동안 루프가 반복됩니다.

두 변수의 값이 각각 조건에 도달하면 루프가 중단되고 스크립트의 나머지 부분이 실행됩니다.

# $val 및 $i 변수를 초기값 0으로 선언합니다.
$val = 0
$i = 0

# While 루프를 설정하여 $val이 3이 되고 $i가 5가 될 때까지 실행합니다.
while($val -ne 3 -and $i -ne 6)
{
	# $val을 1씩 증가시킵니다.
  $val++
	# $i를 2씩 증가시킵니다.
  $i += 2
	# $val 및 $i 변수의 현재 값을 출력합니다.
  Write-Host "$val, $i"
}

while 루프를 AND 연산자로 실행

Executing a while loop with AND operator

이제 아래 코드를 실행하세요. 이 코드는 사용자에게 나이를 묻습니다. 나이는 $age 변수에 저장됩니다.

만약 사용자가 숫자를 입력하면서 1보다 작거나 (-lt) 숫자가 아닌 경우 (-nomatch), 사용자에게 유효한 숫자를 입력하도록 다시 요청합니다. 이 동작은 사용자에게 유효한 입력을 여러 번 시도할 수 있게 도움이 됩니다.

# 사용자에게 나이 입력을 요청합니다.
$age = Read-Host "Please Enter Your Age"

# 사용자가 유효한 입력을 제공할 때까지 While 루프를 실행합니다.
while($age -notmatch "\\d+" -or $age -lt 1)
{
	# 사용자에게 유효한 나이 숫자를 다시 입력하도록 요청합니다.
  $age = Read-Host "Please Enter Your Valid Age"
}
# 유효한 나이 입력을 출력합니다.
Write-Host "Your age is $age

아래 결과에서 사용자는 세 번의 기회 동안 나이를 입력하도록 요청받았습니다:

  • 처음으로 사용자가 입력한 것은 ten이라는 숫자가 아닙니다.
  • 두 번째로, 사용자가 입력한 것은 0이라는 1보다 작은 숫자입니다.
  • 세 번째로, 사용자가 입력한 것은 10이라는 유효한 나이입니다.
Executing a while loop with the OR operator

WHILE 루프에서 BREAK 및 CONTINUE 키워드 사용

while 루프가 PowerShell 스크립트에 유연성을 추가하는 방법을 보았습니다. 그러나 더 잘 제어하기 위해, 원하는 항목이 처리될 때 루프를 종료하는 breakcontinue 키워드를 추가하세요.

예를 들어, 배열에서 특정 수의 항목만 처리하려는 경우 BREAK 키워드를 사용하여 원하는 수의 항목이 처리된 후 루프를 종료할 수 있습니다.

이러한 키워드의 기능은 다음과 같습니다:

Keyword Function
break Immediately exits the loop and continues execution with the rest of the script.
continue Skips over the remaining code block in the current iteration of the loop and continues with the next iteration.

아래 코드를 실행하여 10개의 항목으로 구성된 배열을 반복합니다.

아래 코드에서 if 문은 $i의 값을 확인합니다. 만약 $i의 값이 5이면, continue 키워드는 루프에서 나머지 코드를 건너뛰고 다음 반복을 계속합니다. 만약 $i의 값이 8이면, break 키워드는 루프를 종료하고 스크립트의 나머지 부분을 계속합니다.

그렇지 않으면, while 루프가 출력(Write-Host)하고 $i 변수의 값을 1 증가시킵니다.

# 10개 항목의 배열을 선언합니다
$array = 1..10
# 초기값이 0인 $i 변수를 선언합니다
$i = 0
# 조건이 충족될 때까지 While 루프를 실행합니다
while($i -lt $array.Count)
{
	# $i가 5와 같은지 확인합니다
  if($i -eq 5)
  {
		# 맞다면, $i를 1 증가시킵니다
    $i++
		# 다음 반복을 계속합니다
    continue
  }
	# $i가 8과 같은지 확인합니다
  if($i -eq 8)
  {
		# 맞다면, While 루프를 탈출하고 스크립트의 나머지 부분을 계속합니다
    break
  }
	# 현재 $i의 값을 출력합니다
  Write-Host "Processing item $i"
	# $1을 1씩 증가시킵니다
  $i++
}

출력 결과에서 볼 수 있듯이, 루프는 배열의 다섯 번째와 여덟 번째 항목을 건너뛰었습니다. while 루프는 배열의 다른 모든 항목을 처리하고 여덟 번째 항목에 도달한 후 종료되었습니다.

Executing a while loop with break and continue keywords

While 루프가 실행되는 시간 제한하기

보통 루프가 실행되는 시간을 제한하고 싶을 수 있습니다. 원격 서버에 연결을 시도하고 있다면, 서버가 응답하기 전에 시간을 제공하여 루프를 종료하고 타임아웃하는 방법은 while 루프 내에서 Start-Sleep cmdlet를 사용하는 것입니다.

Start-Sleep cmdlet은 지정된 시간 동안 스크립트의 실행을 일시 중지합니다.

아래의 코드를 실행하여 현재 날짜와 시간을 가져와 $startTime 변수에 저장합니다. while 루프는 현재 날짜/시간이 $startTime에 저장된 값으로부터 10초 미만인 동안 실행됩니다.

while 루프가 실행되는 동안 Start-Sleep cmdlet이 스크립트의 실행을 1초 동안 일시 중지하는 동안 메시지가 인쇄됩니다.

아래 코드 블록은 실제로 실무에서 사용할 내용에 대한 표본입니다. 필요에 따라 루프 내부의 코드를 추가할 수 있습니다.

# 현재 날짜/시간을 가져와 저장합니다.
$startTime = Get-Date
# 현재 날짜/시간이 10초 미만인 동안 While 루프를 실행합니다.
	# $startTime에 저장된 값에서 가져옵니다.
while((Get-Date) -lt ($startTime.AddSeconds(10)))
{
	# 메시지를 출력합니다.
  Write-Host "Waiting for server to respond..."
	# 스크립트를 1초 동안 일시 정지합니다.
  Start-Sleep -Seconds 1
}

아래에서는 루프가 종료되기 전에 10초 동안 계속 실행되는 것을 볼 수 있습니다.

Limiting the time a while loop runs

결론

PowerShell while 루프는 복잡한 개념에 직면했을 때 루프에 갇히지 않고 스크립트를 작성하는 동안 유용합니다. 이 튜토리얼에서는 while 루프를 사용하여 더 유연하고 강력한 스크립트를 만드는 다양한 방법을 배웠습니다.

이 새로운 지식을 활용하여 논리 연산자와 키워드를 최대한 활용하여 스크립트로 작업을 자동화해 보는 것은 어떨까요?

Source:
https://adamtheautomator.com/powershell-while-loop/