Netwrix 1Secure는 데이터와 아이덴티티 전반에 걸쳐 통합된 가시성을 제공합니다 - 14일간 무료로 전체 액세스가 가능합니다.무료 평가판 시작

리소스 센터블로그

PowerShell For 루프 & While 루프: 시스템 자동화 마스터

PowerShell For 루프 & While 루프: 시스템 자동화 마스터

Mar 2, 2025

PowerShell 루프는 For, ForEach, While, Do-While, Do-Until 같은 구문을 통해 반복 작업과 대량 작업을 자동화합니다. 각 루프 유형은 배열을 순회하는 것부터 프로세스를 모니터링하거나 로그를 필터링하는 것까지 다양한 사용 사례를 지원합니다. 루프에 Break, Continue, Try-Catch 및 파이프라인을 결합하면 효율성과 오류 처리가 향상됩니다. 대규모 데이터셋의 경우 ForEach-Object는 메모리 효율적인 처리를 가능하게 하며, 이는 엔터프라이즈 자동화와 클라우드 운영에 필수입니다.

PowerShell은 시스템 관리자를 위해 설계된 크로스플랫폼 명령줄 셸 및 스크립팅 언어입니다. PowerShell 명령을 스크립트로 결합하면 반복 작업을 자동화하고 대규모 데이터셋을 효율적으로 처리할 수 있습니다.

루프는 코드 블록을 여러 번 실행할 수 있도록 구조화된 방법을 제공한다는 점에서 스크립팅에 중요한 역할을 합니다. 이 문서에서는 사용 가능한 다양한 루프의 유형을 심층적으로 살펴보며, 많은 일반적인 사용 사례에 대한 예제 스크립트, 오류를 매끄럽게 처리하는 방법, 스크립트 효율을 개선하기 위한 전략, 가독성과 관리성을 보장하기 위한 모범 사례를 포함합니다.

PowerShell에서 루프가 가치 있는 이유

루프는 지정한 조건이 충족될 때까지 코드 블록을 반복적으로 실행하는 프로그래밍 제어 구조입니다. 루프는 반복 작업을 자동화하고, 데이터 수집을 처리하며, 대량 작업을 수행하는 데 필수적입니다.

PowerShell 루프 유형 개요

PowerShell은 반복 작업을 자동화하기 위해 여러 유형의 루프를 제공합니다. 각 루프는 고유한 강점이 있어 다양한 상황에 적합합니다. 아래는 각 루프 유형에 대한 개요입니다:

  • For — PowerShell의 For 루프는 루프를 실행하려는 횟수를 알고 있을 때 이상적입니다. 그러면 루프의 각 반복이 끝날 때마다 카운터 변수를 1씩 증가시키도록 설정하기만 하면 됩니다.
  • ForEach — ForEach 루프는 배열이나 목록의 요소처럼 항목 컬렉션을 순회하도록 설계되었습니다. 예를 들어 이름 목록을 하나씩 순회하면서 각각을 콘솔에 출력할 수 있습니다.
  • While — PowerShell의 While 루프는 지정된 조건이 거짓이 될 때까지 코드 블록을 실행하므로, 반복 횟수를 알 수 없는 시나리오에 적합합니다. 예를 들어 특정 플래그가 True로 설정되어 있는 동안 코드를 실행할 수 있습니다. 조건은 첫 실행 전에 확인되므로, 코드 블록이 한 번도 실행되지 않을 수도 있습니다.
  • Do-While — Do-While 루프는 While 루프와 유사하지만 중요한 한 가지 차이가 있습니다. 조건을 확인하기 전에 코드 블록을 먼저 실행하므로, 최소 한 번은 실행됩니다.
  • Do-Until — Do-Until 루프는 PowerShell의 While 루프와도 비슷하지만, 조건이 참이 될 때까지 루프 실행이 계속됩니다.

업무 자동화에서 루프를 활용하는 실용적인 방법

루프는 데이터를 처리하고 보고서를 생성하며 소프트웨어 업데이트를 확인하고 서비스 상태를 검증하는 작업에서 중요한 역할을 합니다. 예를 들어 루프를 사용하면 서버 목록을 대상으로 지속적으로 핑을 보내 가용성을 확인하고, 어떤 서버든 도달 불가 또는 응답 없음 상태가 되면 IT 팀에 자동으로 알릴 수 있습니다. 또한 루프는 Active Directory 에서 사용자 계정을 만들거나 수정하는 것과 같은 대량 작업이나, 보안 감사를 위해 로그 파일을 처리하는 데에도 사용할 수 있습니다.

초보자를 위한 Windows PowerShell 스크립팅 튜토리얼

무료 다운로드

자세히 알아보기

PowerShell의 루프 유형과 사용 시기

For 루프

PowerShell의 For 루프는 다음 구문을 사용합니다:

      for ([Initialization]; [Condition]; [Increment/Decrement]) {

  # Code to be executed in each iteration

}
      
  • 초기화 — 이 부분에서는 카운터 변수를 정의하고 초기 값을 설정합니다. 루프 시작 시 실행됩니다.
  • 조건 — 이 부분에서는 루프가 반복을 계속하기 위해 참으로 유지되어야 하는 조건을 지정합니다.
  • 증가/감소 — 이 부분은 각 반복이 끝난 뒤 실행되며, 보통 카운터 변수의 값을 업데이트하는 데 사용됩니다.

이 예에서는 변수 $i를 1로 초기화하고, $i가 5보다 작거나 같을 때까지 루프가 실행되며, $i는 각 반복 후 1씩 증가합니다:

      for ($i = 1; $i -le 5; $i++) {

    Write-Host "Iteration: $i"

}
      
a screenshot of a windows powershell window showing a list of iterations .

For 루프의 일반적인 사용 사례는 다음과 같습니다:

  • 배열을 순회하기 — 다음 For 루프 예제에서는 PowerShell이 배열을 순회하면서 각 요소를 콘솔에 출력합니다:
      # Define an array of fruits

$fruits = @("apple", "banana", "cherry")

# Iterate through the array using a for loop

for ($i = 0; $i -lt $fruits.Length; $i++) {

    Write-Output $fruits[$i]

}
      
Image
  • 카운팅 — for 루프를 사용해 1부터 10까지의 숫자를 출력하는 방법은 다음과 같습니다:
      # Counting from 1 to 10

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

    Write-Output $i

}
      
Image
  • 표 생성하기 — 다음 스크립트는 5를 곱하는 방법을 보여주는 표를 생성합니다:
      # Generating a multiplication table for 5

$multiplicand = 5

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

    $result = $multiplicand * $i

    Write-Output "$multiplicand * $i = $result"

}
      
Image

ForEach 루프

ForEach 루프는 컬렉션의 각 항목마다 코드 블록을 실행합니다. 다음의 간단한 예제는 세 가지 이름으로 배열($names)을 만들고 각 이름을 콘솔에 출력합니다:

      $names = "Alice", "Bob", "Charlie"

foreach ($name in $names) {

  # Code to execute for each item in the collection

  Write-Host "Hello, $name!"

}
      

다음 스크립트는 디렉터리에서 모든 텍스트 파일을 가져와, 백업임을 나타내기 위해 새 이름으로 같은 디렉터리에 저장합니다:

      # Define the directory path and get all .txt files

$directory = "D:\Backup"

$files = Get-ChildItem -Path $directory -Filter "*.txt"

# Iterate over each file and rename it

foreach ($file in $files) {

    $newName = "$($file.BaseName)_backup$($file.Extension)"

    $newFullPath = Join-Path -Path $directory -ChildPath $newName

    # Rename the file

    Rename-Item -Path $file.FullName -NewName $newFullPath -Force

    Write-Host "Renamed: $($file.Name) ? $newName"

}
      
a screenshot of a file explorer window and a screenshot of a command line window .

While 루프, Do-While 루프, Do-Until 루프

While 및 Do-While 루프

While 및 Do-While 루프는 지정된 조건이 충족되는 동안 코드 블록을 반복해서 실행합니다. 따라서 루프가 몇 번 실행되어야 하는지 미리 알지 못할 때 유용합니다.

앞서 언급했듯이 While과 Do-While의 핵심 차이점은 조건을 언제 확인하느냐에 있습니다. PowerShell의 While 루프는 코드를 실행하기 전에 조건을 확인하는 반면, Do-While 루프는 조건을 확인하기 전에 한 번 루프를 실행합니다. 따라서 조건이 처음에 거짓이어도 코드가 실행됩니다.

예를 들어, 다음 스크립트는 프로세스가 닫힐 때까지 5초마다 메모장 프로세스의 상태를 확인하기 위해 Do-While 루프를 사용합니다:

      $processComplete = $false

do {

    Write-Host "Waiting for process to complete..."

    Start-Sleep -Seconds 5  # Simulate process waiting

    $processComplete = !(Get-Process -Name "notepad" -ErrorAction SilentlyContinue)

} while (-not $processComplete)

Write-Host "Process has completed!"
      
Image

Do-Until 루프

Do-Until 루프는 Do-While과 비슷하지만, Do-While 루프는 조건이 참인 동안 계속 실행되는 반면 Do-Until 루프는 조건이 거짓인 동안 계속 실행됩니다. 따라서 어떤 이벤트가 발생하기를 기다리는 경우 Do-Until이 더 효율적입니다.

예를 들어, 다음 스크립트는 Do-Until 루프를 사용하여 파일 업데이트가 발생할 때까지 대기합니다. 5초마다 현재 마지막 기록 시간과 $lastModified 변수를 비교하며, 두 값이 달라지는 즉시 해당 파일이 업데이트되었다는 메시지를 출력합니다.

      # Path of the file to monitor

$filePath = "D:\Backup\myfile_backup.txt"

# Get the initial last write time of the file

$lastModified = (Get-Item $filePath).LastWriteTime

do {

    Write-Host "Waiting for file update..."

    Start-Sleep -Seconds 5

# Get the current write time and compare the last write time

} until ((Get-Item $filePath).LastWriteTime -ne $lastModified)

Write-Host "File has been updated!"
      
Image

향상된 자동화를 위한 고급 루프 기법

루프와 If-Else 조건문을 결합하기

If 및 Else 문을 사용하면 루프 안에서 정의된 조건에 따라 코드를 조건부로 실행할 수 있습니다. 예를 들어, 다음 코드는 0부터 9까지 반복하면서 각 숫자가 짝수인지 홀수인지 보고합니다:

      # Print even and odd numbers in a range

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

    if ($i % 2 -eq 0) {

        Write-Output "$i is even"

    } else {

        Write-Output "$i is odd"

    }

}
      
Image

Break로 루프를 조기에 종료하기

Break 문은 지정한 조건이 충족되면 루프를 종료하는 데 사용됩니다. 루프 안의 나머지 코드는 실행되지 않습니다.

다음 예에서는 for 루프가 1부터 19까지 반복하도록 설정되어 있습니다. 하지만 6의 배수가 발견되면 해당 항목을 출력하고 루프를 종료합니다:

Image

Continue로 불필요한 반복 건너뛰기

Continue 문은 현재 루프 반복에서 나머지 코드를 건너뛰고 다음 반복으로 이동합니다. 다음 예에서는 1부터 9까지의 숫자를 반복하며, 4의 배수는 제외하고 각각을 출력합니다:

      # Print all numbers except multiples of 4

for ($i = 1; $i -lt 10; $i++) {

    if ($i % 4 -eq 0) {

        continue

    }

    Write-Output $i

}
      
Image

루프에서의 메모리 관리

ForEach-Object cmdlet으로 메모리 사용량 줄이기

컬렉션에 들어 있는 객체를 순회하려는 경우 ForEach 루프를 사용할 수는 있지만, 대신 ForEach-Object cmdlet을 사용하는 것이 더 바람직한 경우도 있습니다:

  • ForEach 루프 는 변수에 메모리로 저장된 컬렉션을 순회합니다. 컬렉션이 이미 메모리에 있고 빠른 결과가 필요할 때 적합합니다.
  • ForEach-object cmdlet 은 파이프라인을 통과하는 동안 항목을 한 번에 하나씩 처리하므로 메모리 사용량을 크게 줄입니다. 특히 대용량 로그 파일을 한 줄씩 개별 처리할 때 유용합니다.

다음 스크립트는 ForEach-Object cmdlet을 사용하여 특정 이벤트 ID를 가진 이벤트 뷰어 로그 항목을 찾아 해당 이벤트를 텍스트 파일에 저장합니다:

      # Define the log name and filter criteria

$logName = "Application"

$eventLevel = "Error"  # Filter for logs with the level "Error"

$eventID = 1000        # Filter for logs with the event ID 1000

# Get the Event Viewer logs and filter using ForEach-Object to reduce memory usage

Get-WinEvent -LogName $logName | ForEach-Object {

    # Check if the log entry matches the filter criteria

    if ($_.LevelDisplayName -eq $eventLevel -and $_.Id -eq $eventID) {

        # Output the filtered log entry

        $_

    }

} | Out-File -FilePath "D:\Backup\eventviewer_logs.txt"
      
Image

복잡한 데이터 처리를 위한 중첩 루프

PowerShell을 사용하면 하나의 For 루프 안에 다른 For 루프를 중첩할 수 있습니다. 이 기법은 다음과 같은 작업에 활용할 수 있습니다:

  • 배열의 배열이나 행렬처럼 다차원 데이터를 효율적으로 처리
  • JSON, XML 및 중첩 해시 테이블과 같은 계층적 구조 처리
  • 구조화된 데이터에 대해 반복 작업 수행 예: 로그 파일 일괄 처리

예시: 다단계 데이터 구조 만들기

다음 스크립트는 중첩 For 루프를 사용해 구구단(곱셈표)을 생성합니다:

      $size = 5  # Define table size

for ($i = 1; $i -le $size; $i++) {  # Outer loop for rows

    for ($j = 1; $j -le $size; $j++) {  # Inner loop for columns

        Write-Host -NoNewline "$($i * $j)`t"

    }

    Write-Host  # Newline after each row

}
      
Image

예시: 계층형 데이터 처리(중첩 해시 테이블)

ForEach 루프와 같은 다른 유형의 루프도 중첩할 수 있으며, 다음 스크립트에서 계층형 데이터를 처리하는 예를 보여줍니다:

      $users = @{

    "Alice"   = @("Admin", "Editor")

    "Bob"     = @("User")

    "Charlie" = @("Moderator", "Editor", "User")

}

foreach ($user in $users.Keys) {  # Outer loop iterates over usernames

    Write-Host "User: $user"

    foreach ($role in $users[$user]) {  # Inner loop iterates over roles

        Write-Host "  - Role: $role"

    }

}
      
Image

루프에서의 오류 처리 및 디버깅

안정적인 스크립트 실행을 위한 Try-Catch의 중요성

PowerShell 스크립트가 파일을 찾을 수 없음, 권한 거부 또는 네트워크 문제와 같은 실패 조건을 만날 수 있다면 오류 처리는 필수입니다. Try-Catch 블록을 사용한 적절한 오류 처리는 스크립트가 의미 있는 오류 메시지를 표시하여 이러한 예외를 우아하게 처리하고 계속 실행하거나 안전하게 종료할 수 있도록 보장합니다.

다음은 파일을 업데이트하기 위한 스크립트로, 파일을 찾을 수 없거나 서버에 연결할 수 없는 경우를 Try-Catch로 매끄럽게 처리합니다:

      $sourceFile = "D:\Office\project\myfile.txt"  # The file to be updated

$serverName = "google.com"      # The server to check

# 1. Find the source file (with error handling)

try {

    if (!(Test-Path $sourceFile)) {

        throw "Source file not found: $sourceFile" # Throw custom error

    }

    Write-Host "Source file found: $sourceFile"

} catch {

    Write-Error $_

    exit 1 # Exit the script if the file isn't found

}

# 2. Check network connectivity (with error handling)

$networkStatus = $null # Initialize network status variable

try {

    if (Test-NetConnection -ComputerName $serverName -ErrorAction Stop) {

        Write-Host "Ping to $serverName successful."

        $networkStatus = "Connected"

    } else {

        Write-Warning "Ping to $serverName failed."

        $networkStatus = "Failed"

    }

} catch {

    Write-Error "Error checking network connection: $_"

    $networkStatus = "Error: $($_.Exception.Message)" # Store error message

}

# 3. Edit the file with the results (with error handling)

try {

    $content = Get-Content $sourceFile

    $newContent = "$content`nNetwork Check Result: $networkStatus" # Add a newline

    Set-Content -Path $sourceFile -Value $newContent -ErrorAction Stop

    Write-Host "File '$sourceFile' updated successfully."

    Write-Host "New content:"

    Get-Content $sourceFile #Print the new content

} catch {

    Write-Error "Error updating file: $_"

}

Write-Host "Script complete."
      
Image

PowerShell 루프 성능 최적화 팁

다음 전략은 For 루프를 사용할 때 실행 시간과 리소스 소비를 줄이는 데 도움이 됩니다.

불필요한 반복을 줄이세요.

불필요한 반복 루프의 반복 횟수를 줄이려면 루프에 들어가기 전에 데이터를 필터링하고, 특정 조건이 충족되면 Break와 Continue를 사용해 루프를 종료하세요.

루프 내부에서 불필요한 계산을 수행하지 마세요.

PowerShell에서 루프 효율을 개선하기 위한 핵심 모범 사례는 루프 내부에서 불필요한 계산을 피하는 것입니다. 대신 가능하면 루프 밖에서 값을 미리 계산하세요. 예를 들어 함수나 명령이 반복 중에는 변하지 않는 데이터를 가져온다면, 루프에 들어가기 전에 한 번만 실행해야 합니다.

루프의 가독성과 유지보수성을 높이세요.

루프를 더 쉽게 이해하고 유지 관리할 수 있도록 다음을 확인하세요:

  • 명확한 변수 이름을 사용하고 들여쓰기를 일관되게 유지하세요.
  • 복잡한 로직을 별도의 함수로 분리하는 모듈식 설계를 사용하세요.
  • 반복 횟수가 알려져 있으면 For 루프를 사용하고, 조건에 따라 반복해야 하면 While 루프를 사용하세요.
  • 루프를 간결하게 유지하고 불필요한 중첩을 피하세요.

콘솔 출력은 최소화하세요.

불필요한 Write-Host 사용을 피하세요.

파이프라인을 효과적으로 사용해 스크립트 오버헤드를 줄이세요.

대규모 데이터셋을 처리할 때는 파이프라인을 사용해 한 cmdlet에서 다음 cmdlet으로 데이터를 스트리밍하세요. 이 방식은 메모리에 대규모 중간 결과를 저장할 필요를 없애 오버헤드를 크게 줄여줍니다.

ForEach 루프와 ForEach-Object cmdlet을 현명하게 사용하세요.

앞서 언급했듯이 ForEach-Object cmdlet은 ForEach 루프보다 메모리 사용량이 적으므로, 적절한 경우 스크립트를 수정해 ForEach-Object를 사용하도록 고려하세요.

예를 들어, 아래에는 foreach 루프를 사용해 한 디렉터리에서 다른 디렉터리로 파일을 복사하는 스크립트가 있으며, 이어서 foreach-object cmdlet을 사용해 동일한 목표를 달성하는 스크립트가 있습니다.

ForEach 루프 사용하기

      # Define the source and destination directories

$directoryPath = "D:\Office\Backup"

$destinationDirectory = "D:\Office\myfolder"

# Ensure the destination directory exists

if (-not (Test-Path -Path $destinationDirectory)) {

    New-Item -ItemType Directory -Path $destinationDirectory

}

# Get all files in the directory

$files = Get-ChildItem -Path $directoryPath

# Process each file

foreach ($file in $files) {

    try {

        # Read content and write to another file

        $content = Get-Content -Path $file.FullName

        $newFileName = Join-Path -Path $destinationDirectory -ChildPath $file.Name

        $content | Out-File -FilePath $newFileName

        Write-Output "Processed file: $($file.FullName)"

    } catch {

        Write-Output "Error processing file: $($file.FullName). $_"

    }

}

Write-Output "File processing completed."
      
Image
ForEach-Object cmdlet 사용하기
      # Define the source and destination directories

$directoryPath = "D:\Office\Backup"

$destinationDirectory = "D:\Office\myfolder"

# Ensure the destination directory exists

if (-not (Test-Path -Path $destinationDirectory)) {

    New-Item -ItemType Directory -Path $destinationDirectory

}

# Process each file using the pipeline

Get-ChildItem -Path $directoryPath | ForEach-Object {

    try {

        # Read content and write to another file

        $content = Get-Content -Path $_.FullName

        $newFileName = Join-Path -Path $destinationDirectory -ChildPath $_.Name

        $content | Out-File -FilePath $newFileName

        Write-Output "Processed file: $($_.FullName)"

    } catch {

        Write-Output "Error processing file: $($_.FullName). $_"

    }

}

Write-Output "File processing completed."
      
Image

PowerShell 루프의 실제 적용 사례

시스템 관리 작업 자동화

관리자는 파일, 디렉터리 또는 사용자 계정 집합과 같이 컬렉션에 포함된 각 개체에 대해 특정 작업을 수행하기 위해 반복문을 사용할 수 있습니다. 예를 들어 반복문을 사용하여 네트워크의 모든 서버에 보안 패치를 적용할 수 있습니다. 또한 시스템 리소스를 모니터링하고 필요할 때 서비스를 재시작하거나 알림을 보낼 수 있으며, Active Directory 개체를 수정하거나 삭제할 수도 있습니다.

ForEach-Object Cmdlet으로 서버 점검 자동화

다음 스크립트는 서버가 온라인 상태인지 여부를 보고합니다:

      $servers = @("lhehost9", "lhehost10", "lhehost11")

$servers | ForEach-Object {

# check if the server is reachable

    $status = Test-Connection -ComputerName $_ -Count 2 -Quiet

    if ($status) {

        Write-Output "$_ is online"

    } else {

        Write-Output "$_ is offline"

    }

}
      
Image

While 반복문으로 시스템 작업 스케줄링

이 스크립트는 Spooler 서비스의 상태를 모니터링하며 필요할 때 다시 시작합니다:

      $serviceName = "Spooler"

while ($true) {

    $service = Get-Service -Name $serviceName

    if ($service.Status -ne "Running") {

        Write-Output "$(Get-Date): $serviceName is not running. Restarting..."

        Restart-Service -Name $serviceName -Force

    }

    else {

        Write-Output "$(Get-Date): $serviceName is running normally."

    }

    Start-Sleep -Seconds 30  # Check every 30 seconds

}
      
Image

엔터프라이즈 환경에서의 데이터 처리

엔터프라이즈 환경에서는 데이터 처리가 종종 데이터베이스, 로그 파일, 시스템 리소스 등 다양한 소스에서 대량의 데이터를 다루는 것을 포함합니다. 루프를 사용하면 이러한 대규모 데이터셋을 반복 처리하여 보고를 간소화하고 이벤트 로그를 분석하며 관련 없는 데이터를 필터링할 수 있습니다.

루프를 사용해 보고서를 자동화하기

다음 스크립트는 특정 조직 구성 단위(OU)에 있는 모든 Active Directory 사용자를 나열하는 .csv 파일을 생성합니다:

      $users = Get-ADUser -SearchBase "OU=Engineering,OU=US Staff,DC=ca,DC=lo" -Filter * -Property Name, SamAccountName, EmailAddress 

$reportPath = "C:\Reports\ADUsersReport.csv"

$users | ForEach-Object {

    "$($_.Name),$($_.SamAccountName),$($_.EmailAddress)" | Out-File -Append -FilePath $reportPath

}

Write-Output "Report generated at $reportPath"
      
Image

반복문을 사용해 로그를 필터링하기

이 스크립트는 시스템 로그에서 가장 최근 1,000개 항목을 가져오고, 중요 이벤트를 나열하는 .csv 파일을 생성합니다:

      $logName = "System"

$eventLimit = 1000

$outputFile = "C:\Reports\EventLogs.csv"

# Ensure the log file has a header

"TimeCreated,EventID,Provider,Message" | Set-Content -Path $outputFile

# Get the latest 1000 events and filter for Critical and Error events

$events = Get-WinEvent -LogName $logName -MaxEvents $eventLimit | Where-Object { $_.Level -le 2 }

# Process each event safely

$events | ForEach-Object {

    $eventTime = $_.TimeCreated

    $eventID = $_.Id

    $provider = $_.ProviderName

    $message = $_.Message -replace "`r`n", " "  # Remove newlines for better CSV formatting

    # Handle missing or null messages

    if ([string]::IsNullOrEmpty($message)) {

        $message = "No description available"

    }

    # Append to file

    "$eventTime,$eventID,$provider,$message" | Add-Content -Path $outputFile

}

Write-Output "Filtered logs saved at $outputFile"
      
Image
DevOps 및 클라우드 운영을 위한 PowerShell 반복문
클라우드 인프라 관리를 위한 루프 기반 자동화

현대적인 DevOps 및 클라우드 환경에서는 PowerShell 반복문이 인프라를 관리하고 확장하는 데 중요한 역할을 할 수 있습니다. 관리자는 가상 머신과 docker 컨테이너를 업데이트하고 클라우드 인프라 전반에 보안 패치를 적용하는 등 반복적인 작업을 자동화할 수 있습니다. 또한 반복문을 사용해 Azure Resource group과 같은 클라우드 인프라 내의 가상 머신을 순회하면서 상태를 점검하고, 예기치 않게 중지된 가상 머신을 시작할 수 있습니다. 마찬가지로 컨테이너화된 환경에서는 업데이트된 docker 이미지를 가져오고, 중지된 컨테이너를 재시작하며, 서비스 가용성을 보장하는 등의 작업을 자동화하는 데 반복문이 도움이 됩니다.

가상 머신 또는 컨테이너를 반복 순회하여 업데이트 또는 점검하기

다음 스크립트는 ForEach 루프를 사용하여 각 Docker 컨테이너의 상태를 확인하고, 해당 컨테이너의 ID와 이름을 추출한 다음 콘솔에 상태를 출력합니다:

      # Ensure Docker is installed and running

# Get a list of all running containers

$containers = docker ps --format "{{.ID}} {{.Names}}"

# Loop through each container and check its status

foreach ($container in $containers) {

    $containerId, $containerName = $container -split ' '

    Write-Output "Checking status for container: $containerName ($containerId)"

    # Get the status of the container

    $status = docker inspect --format "{{.State.Status}}" $containerId

    Write-Output "Status of container $containerName: $status"

}

Write-Output "All container statuses have been checked."
      
Image

결론

PowerShell은 For, ForEach, While, Do-While, Do-Until 루프를 포함해 다양한 사용 사례를 지원하는 스크립트를 만들 수 있도록 여러 유형의 루프를 제공합니다. Try-Catch 블록과 Break-Continue 문을 사용하면 오류 조건을 매끄럽게 처리하고 스크립트 효율을 높일 수 있습니다. 루프에 대한 역량을 키우려면 여기의 코드 예제를 자유롭게 실험해 보세요.

FAQ

ForEach와 ForEach-Object의 차이점은 무엇인가요?

ForEach 루프는 메모리에 있는 데이터 컬렉션을 순회하는 데 사용되는 반면, foreach-object cmdlet은 파이프라인에서 들어오는 데이터를 처리하는 데 사용됩니다. foreach-object는 파이프라인을 통해 스트리밍되는 각 항목을 한 번에 하나씩 처리하므로 메모리 효율적입니다. 반면 foreach는 데이터셋이 더 작은 경우에 더 빠른 성능을 제공합니다.

대규모 데이터셋에 대해 PowerShell 루프를 최적화하려면 어떻게 해야 하나요?

대규모 데이터셋을 처리할 때는 루프에 들어가기 전에 데이터를 필터링하고, foreach 루프 대신 foreach-object cmdlet을 사용하며, 반복문 외부에서 값을 미리 계산해 매 반복마다 불필요한 연산이 수행되지 않도록 하면 메모리 사용량과 실행 시간을 최소화할 수 있습니다.

PowerShell 루프를 조기에 종료할 수 있나요?

네, Break 및 Continue 문을 사용하면 루프를 종료하거나 현재 반복만 건너뛸 수 있습니다. Break 문은 전체 루프를 즉시 종료하고 다음 문으로 제어를 전환하는 반면, Continue 문은 현재 반복에서 남은 문을 건너뛰고 다음 반복으로 진행합니다.

PowerShell에서 루프를 디버깅하는 가장 좋은 방법은 무엇인가요?

PowerShell에서 루프를 디버깅하는 좋은 방법은 각 반복(iteration) 동안 변수 값을 출력하기 위해 Write-Host, Write-Debug 또는 Write-Output을 사용하는 것입니다.

공유하기

더 알아보기

저자 소개

Tyler Reese

제품 관리 부사장, CISSP

소프트웨어 보안 업계에서 20년이 넘는 경력을 쌓아온 Tyler Reese는 오늘날 기업이 직면한 빠르게 변화하는 아이덴티티 및 보안 과제에 대해 깊이 잘 알고 있습니다. 현재 그는 Netwrix Identity and Access Management 포트폴리오의 제품 디렉터로 재직 중이며, 시장 동향을 평가하고 IAM 제품 라인의 방향을 설정하는 일을 포함해 궁극적으로는 엔드 유저의 요구를 충족하는 역할을 담당하고 있습니다. 그의 전문 경력은 Fortune 500 기업을 대상으로 한 IAM 컨설팅부터 대형 D2C(Direct-to-Consumer) 기업의 엔터프라이즈 아키텍트로 일한 경험까지 폭넓게 이어져 있습니다. 그는 현재 CISSP 자격증을 보유하고 있습니다.