スクリプト管理のための 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 スクリプトは、関係するシステムに過負荷をかけてしまい、接続が切断されたり、その他のエラーにつながることがあります。スクリプト内で適切な待機(ポーズ)を入れることで、こうした問題を回避できます。大量のデータ セットを扱うときやバルク操作を実行するときは、スクリプトの実行をスロットリングすることが特に重要です。
- プロセスを同期させるため — 多くの自動化シナリオでは、1つのプロセスの成功が別のプロセスの完了に依存することがあります。たとえば、スクリプトがデータにアクセスするには、別のプロセスがそのデータに対する作業を完了するまで待つ必要がある場合があります。また、別のサービスが完全に起動するまで、追加の処理を遅らせる必要があることもあります。
PowerShell Start-Sleep コマンドレットの構文
主要パラメーター
PowerShell の待機コマンド Start-Sleep は、PowerShell スクリプトの実行を一時停止する時間の長さをどのように指定したいかによって異なります。基本となるオプションは 2 つです:
- -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>
タイムスパンは主に2つの方法で作成できます:
- 文字列形式を使用する(hh:mm:ss, dd.hh:mm:ss, など)
- New-TimeSpan コマンドレットを使用する
たとえば、PowerShell のスリープ タイマーを 1 分 30 秒に設定したいとします。1 つの方法は、次の hh:mm:ss 形式を使うことです:
Start-Sleep -Duration '00:01:30'
別の選択肢として、次のように New-TimeSpan コマンドレットを使用する方法があります:
$duration = New-TimeSpan -Minutes 1 -Seconds 30
Start-Sleep -Duration $duration
PowerShell における Start-Sleep コマンドレットの例
次の例は、各パラメーターを使用して 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 リクエストなどの動作をシミュレートする場合、またはスクリプトの実行をスロットルする必要がある場合に特に役立ちます。
たとえば、下のスクリプトは 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 スクリプトの実行状況について、特に長時間実行される処理やループに関してユーザーに視覚的なフィードバックを提供すると役立ちます。選択肢としては、進行状況バーとカウントダウン タイマーの 2 つがあります。
進行状況バー
スクリプトが時間のかかる処理を実行している間に進行状況バーを表示するには、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 呼び出し時のレート制限やサーバーの過負荷を回避するのに役立ちます。
- 長い待機時間は分割する。 長い 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 は、リソースのスロットリング(throttling)、過剰な 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 コンサルティングから、大手のダイレクト・トゥ・コンシューマー企業のエンタープライズ アーキテクトとしての業務まで多岐にわたります。現在、彼は CISSP の認定資格を保有しています。