스크립트 관리를 위한 PowerShell Sleep 마스터하기
Aug 25, 2025
PowerShell의 Start-Sleep cmdlet은 정의된 시간 동안 스크립트 실행을 일시 중지해 타이밍, 동기화, 스로틀링을 관리하는 데 도움을 줍니다. 초, 밀리초 또는 시간 범위(-Duration)를 지원하며, 루프, 스케줄링 또는 리소스를 기다릴 때 자주 사용됩니다. Read-Host 같은 대안은 대화형 일시 정지를 가능하게 합니다. 모범 사례로는 긴 Sleep을 더 짧은 간격으로 나누고, 조건 체크에는 Start-Sleep을 사용하지 않으며, 무한 루프나 타임아웃을 방지하는 것을 포함합니다.
PowerShell 스크립트에서 일시 중지 또는 지연이 필요할 수 있는 이유
PowerShell의 Start-Sleep cmdlet은 스크립트의 실행을 일시 중지하고, 지정한 시간만큼 기다립니다. 일시 중지를 전략적으로 사용하면 특히 외부 시스템이나 이벤트에 의존하는 스크립트에서 원활한 동작을 보장하고 오류를 방지하는 데 도움이 됩니다.
PowerShell에서 일시 중지 명령을 사용해야 하는 대표적인 이유 3가지를 소개합니다:
- 리소스를 대기하기 위해 리소스를 대기하기 위해 — 많은 스크립트는 파일, 네트워크 공유, 데이터베이스, API 등 외부 리소스와 상호작용합니다. 스크립트를 실행하기 시작할 때 해당 리소스를 즉시 사용할 수 없거나, 응답하는 데 시간이 필요할 수 있습니다. 예를 들어 스크립트가 백그라운드 작업을 트리거하는 경우, 스크립트 실행을 계속하기 전에 해당 작업이 완료될 시간을 주기 위해 스크립트 실행을 일시 중지해야 할 수 있습니다.
- 스크립트 작업을 제어(스로틀링)하기 위해 — API를 호출하거나 네트워크 요청을 수행하거나 원격 서버에서 명령을 실행하는 PowerShell 스크립트는 관련 시스템에 과부하를 일으켜 연결이 끊기거나 기타 오류가 발생할 수 있습니다. 스크립트에 적절한 일시 중지를 넣으면 이러한 문제를 피하는 데 도움이 됩니다. 대용량 데이터 세트로 작업하거나 대량 작업을 수행할 때는 스크립트 실행을 제어(스로틀링)하는 것이 특히 중요합니다.
- 프로세스를 동기화하기 위해 — 많은 자동화 시나리오에서 한 프로세스의 성공 여부는 다른 프로세스의 완료에 달려 있을 수 있습니다. 예를 들어, 스크립트가 데이터를 접근하려면 다른 프로세스가 해당 데이터에 대한 작업을 끝낼 때까지 기다려야 할 수 있고, 또는 다른 서비스가 완전히 시작할 기회를 주기 위해 추가 작업을 지연해야 할 수도 있습니다.
PowerShell Start-Sleep Cmdlet의 구문
핵심 매개 변수
PowerShell 대기 명령 Start-Sleep 은 PowerShell 스크립트 실행을 일시 중지할 시간의 길이를 어떻게 지정하려는지에 따라 달라집니다. 다음은 두 가지 기본 옵션입니다:
- -Seconds — 이 매개 변수를 사용하면 PowerShell을 지정한 초 동안 일시 중지합니다. 값은 정수일 수 있으며, 예를 들어 2.5초처럼 일시 중지를 원한다면 부동 소수점 수를 사용할 수도 있습니다. 구문은 다음과 같습니다:
Start-Sleep -Seconds <number>
- Milliseconds — 스크립트에서 PowerShell 지연 시간을 밀리초 단위로 지정하려면 아래 구문을 사용하세요. 이 경우 값은 정수여야 합니다.
Start-Sleep -Milliseconds <integer>
약식 사용을 위한 별칭
Windows PowerShell sleep 명령은 각 매개변수에 대해 약식 별칭을 지원하며, 전체 매개변수 이름 대신 사용할 수 있습니다:
- -s 는 -Seconds 매개변수용
- -ms 는 -Milliseconds 매개변수용
예를 들어 “PowerShell wait 5 seconds” 명령을 실행하는 방법은 다음과 같습니다:
Start-Sleep -s 5
그리고 다음은 500밀리초 동안 일시 중지하는 방법입니다:
Start-Sleep -ms 500
-Duration 파라미터 (PowerShell 7.3 이상)
초 또는 밀리초의 숫자를 지정하는 대신 -Duration 파라미터를 사용해 시간 범위를 지정할 수 있습니다. 기본 문법은 다음과 같습니다:
Start-Sleep -Duration <TimeSpan>
시간 범위는 두 가지 주요 방법으로 만들 수 있습니다:
- 문자열 형식 사용 (hh:mm:ss, dd.hh:mm:ss, 등.)
- New-TimeSpan cmdlet 사용
예를 들어 PowerShell 절전 타이머를 1분 30초로 설정하려고 한다고 가정해 봅시다. 한 가지 옵션은 다음과 같은 hh:mm:ss 형식을 사용하는 것입니다:
Start-Sleep -Duration '00:01:30'
다른 옵션으로는 다음과 같이 New-TimeSpan cmdlet을 사용하는 방법이 있습니다:
$duration = New-TimeSpan -Minutes 1 -Seconds 30
Start-Sleep -Duration $duration
PowerShell에서의 Start-Sleep Cmdlet 예시
다음 예시는 각 매개변수를 사용하여 PowerShell 스크립트를 일시 중지하는 방법을 보여줍니다.
초 사용하기
이 스크립트는 날짜와 시간을 가져온 다음 5초 동안 일시 중지하고, 이어서 새 날짜와 시간을 가져옵니다:
Get-Date; Start-Sleep -Seconds 5; Get-Date
분수 초 사용하기
다음 명령은 스크립트 실행을 1.5초 동안 일시 중지합니다:
Start-Sleep -S 1.5
밀리초 사용하기
다음 명령은 스크립트 실행을 500밀리초 동안 일시 중지합니다:
Start-Sleep -Milliseconds 500
시간 범위 사용
다음 PowerShell 일시 중지 스크립트는 -Duration 매개변수를 사용하여 스크립트를 2분 동안 일시 중지합니다:
Write-Host "The script will pause for 2 minutes..."
Start-Sleep -Duration (New-TimeSpan -Minutes 2)
Write-Host "The pause is over, and the script continues."
Start-Sleep
루프 반복 사이에서 일시 중지
루프의 각 반복 사이를 일시 중지하려면 Start-Sleep 를 루프 내부에 사용하면 됩니다. 이는 외부 리소스를 기다려야 하거나 API 요청 같은 동작을 시뮬레이션하거나 스크립트 실행을 제한(throttle)해야 할 때 특히 유용합니다.
예를 들어 아래 스크립트는 while 루프를 5번 실행하고, 각 반복이 끝날 때마다 10초 동안 일시 중지합니다:
$counter = 1 # Initialize a counter
$maxIterations = 5 # Define the maximum number of iterations
while ($counter -le $maxIterations) {
Write-Host "Iteration $counter: Working on the task..."
# Add a 10-second pause between iterations
Start-Sleep -Seconds 10
$counter++ # Increment the counter
}
Write-Host "All iterations are complete."
스크립트 실행 과정을 더 명확히 확인하기 위해 PowerShell ISE에서 실행했습니다:
특정 시간까지 대기
때로는 하루 중 특정 시간에 작업이 실행되어야 할 때가 있습니다. 이 경우 Start-Sleep 과 Get-Date cmdlet을 함께 사용할 수 있습니다.
예를 들어, 다음 스크립트는 오후 6시가 지난 경우 즉시 실행되며, 그렇지 않으면 실행을 위해 오후 6시까지 기다립니다:
# Get the current date and time
$currentTime = Get-Date
# Define the target time for 6 PM
$targetTime = Get-Date -Hour 18 -Minute 0 -Second 0
# Check if the current time is already past 6 PM
if ($currentTime -ge $targetTime) {
Write-Host "It's already past 6 PM. No need to pause."
} else {
# Calculate the time difference until 6 PM
$timeToSleep = $targetTime - $currentTime
# Convert the time difference to total seconds
$secondsToSleep = [math]::Ceiling($timeToSleep.TotalSeconds)
Write-Host "The script will pause for $secondsToSleep seconds until 6 PM."
# Sleep until 6 PM
Start-Sleep -Seconds $secondsToSleep
}
Write-Host "It's now 6 PM or later. Continuing execution."
아래 출력은 오전 4:22에 이 스크립트를 실행하여 생성되었습니다:
대화형 일시 중지 기법 (Read-Host)
가끔은 사용자가 특정 키를 누르거나 비밀번호 또는 질문에 대한 답변처럼 특정 입력을 제공할 때까지 스크립트를 일시 중지해야 하는 경우가 있습니다. 그런 상황에서는 Read-Host cmdlet을 사용하세요. Start-Sleep.
키를 누를 때까지 일시 중지
다음은 Read-Host 를 사용해 Enter 키를 누를 때까지 스크립트를 일시 중지하는 방법입니다:
Write-Host "The script is running. Press Enter to continue..."
Read-Host # Waits for the user to press Enter
Write-Host "You pressed Enter. Continuing the script..."
사용자 입력 요청
파일 삭제나 시스템 변경처럼 파괴적이거나 되돌릴 수 없는 작업을 수행하기 전에 사용자에게 확인을 요청하는 것은 일반적인 절차입니다.
다음 스크립트는 사용자에게 Yes 또는 No 를 답하도록 요청한 뒤 응답이 입력될 때까지 일시 중지합니다:
# Prompt user for confirmation
$userInput = Read-Host "Do you want to continue? (Yes/No)"
# Check the user's response
if ($userInput -eq "Yes" -or $userInput -eq "Y") {
Write-Host "You chose to continue. Proceeding with the script..."
# Insert the next steps of your script here
} elseif ($userInput -eq "No" -or $userInput -eq "N") {
Write-Host "You chose not to continue. Exiting the script."
# Optionally, you can exit the script or perform other actions
exit
} else {
Write-Host "Invalid input. Please enter 'Yes' or 'No'."
# You can loop back and ask again or exit
}
Start-Sleep로 진행 표시줄과 카운트다운 타이머 표시Start-Sleep
PowerShell 스크립트 실행에 대해 사용자에게 시각적 피드백을 제공하면 특히 오래 걸리는 작업과 반복문에서 도움이 될 수 있습니다. 선택지는 진행 표시줄과 카운트다운 타이머 두 가지입니다.
진행 표시줄
스크립트가 시간이 오래 걸리는 작업을 실행하는 동안 진행 표시줄을 표시하려면 Write-Progress cmdlet에 Start-Sleep 를 사용하세요. 아래는 20초 동안의 PowerShell 지연 동안 진행 표시줄을 표시하는 방법을 보여주는 스크립트입니다:
# Total duration for the operation in seconds
$totalDuration = 20
# Loop to simulate a long-running process
for ($i = 1; $i -le $totalDuration; $i++) {
# Calculate the percent complete
$percentComplete = ($i / $totalDuration) * 100
# Display the progress bar
Write-Progress -Activity "Processing..." -Status "Please wait..." -PercentComplete $percentComplete
# Simulate work being done with Start-Sleep
Start-Sleep -Seconds 1 # Sleep for 1 second
}
# Final message after the loop
Write-Host "Process complete!"
PowerShell ISE에서 스크립트를 실행하면 다음과 같이 보입니다:
명령줄에서 스크립트를 실행하면 다음 결과가 나타납니다:
카운트다운 타이머
카운트다운 타이머는 스크립트가 완료되기까지 남은 시간을 표시합니다. 아래 스크립트는 진행률 표시줄과 함께 카운트다운 타이머를 만드는 방법을 보여줍니다:
# Total duration for the countdown in seconds
$totalDuration = 20
# Loop to simulate countdown with progress feedback
for ($i = $totalDuration; $i -ge 1; $i--) {
# Calculate the percent complete
$percentComplete = (($totalDuration - $i) / $totalDuration) * 100
# Display the progress bar and countdown
Write-Progress -Activity "Countdown Timer" -Status "Time remaining: $i second(s)" -PercentComplete $percentComplete
# Simulate a 1 second delay
Start-Sleep -Seconds 1
}
# Final message after the countdown
Write-Host "Countdown complete! Time's up."
PowerShell ISE에서 스크립트를 실행하면 다음과 같이 표시됩니다:
다음은 명령줄에서 실행한 모습을 보여주는 스크린샷입니다:
PowerShell 스크립트에서 Start-Sleep 사용을 위한 모범 사례
다음 모범 사례를 통해 PowerShell 지연 명령 Start-Sleep 를 가장 효과적으로 사용할 수 있습니다:
- 필요할 때만 Start-Sleep 사용. 일반적인 예로는 서비스나 리소스를 기다리는 경우가 있습니다. 또한 일시 중지는 API 호출 시 속도 제한(rate limit)이나 서버 과부하를 방지하는 데 도움이 됩니다.
- 긴 대기 시간을 나눠서 사용하세요. 긴 PowerShell 일시 중지를 더 짧은 간격으로 나누고 Write-Progress 를 사용해 사용자에게 진행 상황을 알려 주세요.
- Start-Sleep을 조건 확인의 대체 수단으로 사용하지 마세요. 예를 들어 파일이 존재하는지 또는 프로세스가 완료되었는지 확인하기 위해 스크립트를 멈출 필요는 없습니다.
Start-Sleep 사용 시 흔히 발생하는 실수와 주의할 점 Start-Sleep
다음은 Start-Sleep 사용 시 주의해야 할 일반적인 문제들입니다:
- 일시 정지(대기) 중단 — Start-Sleep 일시 정지를 Ctrl + C 로 중단하면 리소스가 일관되지 않은 상태로 남을 수 있습니다. 이러한 중단을 관리하고 필요한 정리(클린업) 작업을 수행하려면 try-catch 블록이나 $ErrorActionPreference 등을 사용하세요.
- 일시 정지 시간의 부정확성 — Start-Sleep 과 관련된 타이밍은 시스템 오버헤드로 인해 달라질 수 있으며, 약간의 지연이 발생할 수 있습니다. 시간에 민감한 작업에는 이 cmdlet에 의존하지 말고, 반복 확인과 함께 더 짧은 간격을 사용하는 방안을 고려하세요.
- 무한 루프 — 무한 루프 안에 Start-Sleep 명령을 넣으면 리소스 고갈을 유발할 수 있습니다. 과도한 CPU 및 메모리 사용을 방지하려면 루프에 대한 명확한 종료 조건을 정의하고, 적절한 대기 간격을 사용하며, 타임아웃을 추가하세요.
결론
PowerShell 스크립트에 일시 중지를 전략적으로 추가하는 것은 타이밍을 제어하고, 리소스 과부하를 방지하며, 작업 간 의존성을 처리하는 효과적인 방법입니다. Start-Sleep cmdlet은 리소스 스로틀링, 과도한 API 요청 또는 불필요한 스크립트 오류 같은 문제를 피하는 데 도움이 됩니다. 사용자가 특정 키를 누르거나 특정 입력을 제공할 때까지 스크립트를 일시 중지해야 한다면 Read-Host cmdlet을 사용하세요.
병렬 처리, 비동기 스크립팅, 이벤트 기반 자동화 같은 기법과 함께 이러한 cmdlet을 직접 실험해 보면서, 특정 작업에 가장 적합한 접근 방식을 찾아보세요.
PowerShell 활동에 대한 완전한 가시성 확보
Netwrix Auditor로 PowerShell에서 의심스러운 활동을 탐지하고 규정을 준수하세요
자주 묻는 질문
PowerShell 스크립트를 10초 동안 일시 중지하려면 어떻게 하나요?
PowerShell cmdlet Start-Sleep 를 사용하면 지정한 초 또는 밀리초 동안 스크립트를 일시 중지할 수 있습니다. 예를 들어, 다음 명령은 스크립트 실행을 10초 동안 일시 중지합니다:
Start-Sleep -Seconds 10
PowerShell 스크립트를 재개하기 전에 사용자 입력을 기다리려면 어떻게 하나요?
Write-Host cmdlet을 사용해 사용자에게 입력을 요청하고, Read-Host cmdlet을 사용해 응답이 제공될 때까지 스크립트 실행을 일시 중지할 수 있습니다. 이 방식은 사용자 비밀번호를 수집하거나 작업을 진행하겠다는 사용자의 확인을 받는 데 자주 사용됩니다.
다음 예에서는 사용자가 Enter 키를 누를 때까지 스크립트를 일시 중지하는 방법을 보여줍니다:
Write-Host "The script is running. Press Enter to continue..."
Read-Host # Waits for the user to press Enter
Write-Host "You pressed Enter. Continuing the script..."
PowerShell에서 타임아웃을 설정하려면 어떻게 해야 하나요?
간단한 지연이 필요하다면 PowerShell cmdlet Start-Sleep 을 사용할 수 있습니다. 하지만 실제 타임아웃 처리가 필요할 때, 특히 오래 실행되는 작업이나 백그라운드 작업, 원격 명령의 경우에는 더 나은 옵션으로 Wait-Job 과 System.Threading.Timer 가 있습니다.
이러한 방법을 사용해 여러분의 특정 사용 사례에 맞게 조정해 보세요!
공유하기
더 알아보기
저자 소개
Tyler Reese
제품 관리 부사장, CISSP
소프트웨어 보안 업계에서 20년이 넘는 경력을 쌓아온 Tyler Reese는 오늘날 기업이 직면한 빠르게 변화하는 아이덴티티 및 보안 과제에 대해 깊이 잘 알고 있습니다. 현재 그는 Netwrix Identity and Access Management 포트폴리오의 제품 디렉터로 재직 중이며, 시장 동향을 평가하고 IAM 제품 라인의 방향을 설정하는 일을 포함해 궁극적으로는 엔드 유저의 요구를 충족하는 역할을 담당하고 있습니다. 그의 전문 경력은 Fortune 500 기업을 대상으로 한 IAM 컨설팅부터 대형 D2C(Direct-to-Consumer) 기업의 엔터프라이즈 아키텍트로 일한 경험까지 폭넓게 이어져 있습니다. 그는 현재 CISSP 자격증을 보유하고 있습니다.