PowerShellのSleepとは?TIMEOUTというStart-Sleepに似たコマンドも紹介!

PowerShellのSleepとは?
PowerShellはWindows10に標準で入っているシェル機能です。シェルとはウィンドウでコマンドを入力して様々な処理を行うための機能で、PowerShellはコマンドプロンプトのパワーアップ版といえるでしょう。
Sleepは一般的には指定された時間だけ何もせず待つ機能です。一見役に立たなさそうですが、シェルでは必要になるケースが多いのです。PowerShellにもこの機能があるので、解説します。またPowerShellでWindowsのシステム自体をSleepする方法も解説します。
Start-Sleepでスリープができる
PowerShellでSleepするには、以下のようにします。
Start-Sleep 3
これで3秒スリープします。また、
Start-Sleep -Seconds 3
でも同様です。秒でなくミリ秒で指定したい場合は、
Start-Sleep -Milliseconds 3000
か、もしくは
Start-Sleep -m 3000
で可能です。ちなみに、
Sleep 3
sleep 3
SLEEP 3
でも同じ動作をします。PowerShellのコマンドレットは、大文字小文字が違っていても問題ありません。
エイリアスでsleepと定義されている
Start-SleepではなくSleepでも動作する理由は、エイリアス機能でそのように定義されているからです。PowerShellで以下のように入力してください。
Get-Alias
するとエイリアスの定義がずらっと出てきますが、その中に以下があります。
Alias sleep -> Start-Sleep
これにより、Sleepでも動作するのです。
PowerShellでコマンドプロンプトのTIMEOUTを使える
コマンドプロンプトにはTIMEOUTというStart-Sleepに似たコマンドがあります。PowerShellでこれを使うには以下のようにします。
cmd /c timeout 3
これを実行すると以下のようなメッセージが出て3秒待ちます。数字はカウントダウンで変化します。
3 秒待っています。続行するには何かキーを押してください …
ただしメッセージにあるように、Start-Sleepとは違い何かキーを押すと終了します。
CTRL+Cでスリープは中断される
TIMEOUTで何かのキーを押しても無視して待つようにするには、以下のようにします。
cmd /c timeout 3 /nobreak
すると以下のような表示が出て3秒待ちます。
3 秒待っています。終了するには CTRL+C を押してください …
表示にあるように、CTRL+Cでは止めることが出来てしまいます。ただしこれはPowerShellのStart-Sleepも同様で、CTRL+Cでは中断されます。
PowerShellでTIMEOUTを実現できる?
Start-SleepでTIMEOUTのようにメッセージを出すにはどうしたらよいのでしょうか。以下のようにすればメッセージが出ます。
Write-Host 3秒おまちください;Start-Sleep 3
しかしTIMEOUTのようにカウントダウンはされません。以下のように関数を作れば、1秒毎にメッセージが出せます。
function self_sleep {
param ([Int]$second)
for ($i = 0; $i -lt $second; $i++) {
Write-Host ($second-$i) 秒お待ちください。
Start-Sleep 1
}
}
functionでTIMEOUTに近い処理を実現
上の関数を管理者権限で起動したWindows PowerShell ISEで入力して、ps1ファイルとして保存します。次に、
Set-ExecutionPolicy RemoteSigned
でps1ファイルを実行できるようにして、ps1ファイルを実行します。そして
self_sleep 3
を実行すると、以下のように表示が出て3秒待ちます。
3 秒お待ちください。
2 秒お待ちください。
1 秒お待ちください。
とはいえこれでもTIMEOUTと動作は違います。また1秒毎にsleepが途切れるので、ごくわずかですが、指定した秒数より遅延します。TIMEOUTの動作の方が良ければ、素直にcmd /c timeoutを使いましょう。
Sleepの使い道
そもそもSleepは何の役にたつのでしょうか。例えば以下のようにすれば、180秒後に音を鳴らせます。キッチンタイマーとして使えます。
Start-Sleep 180;echo `a
他には、後で何かのアプリを立ち上げて作業をしなければならない、と言った時には以下のようなことが出来ます。
Start-Sleep 600;notepad.exe c:\test\test.txt
こうすれば10分後にメモ帳でテキストファイルが開きます。PowerShellはWindows標準なので、何かのスケジュールアプリを入れずにできるのは便利でしょう。
Windowsのシステムをスリープさせる
PowerShellでのSleepを、Windowsのシステム自体をスリープする、と捉えた場合も解説しましょう。PowerShellに以下を入力することで、PCをスリープさせられます。
Add-Type -Assembly System.Windows.Forms;[System.Windows.Forms.Application]::SetSuspendState(‘Suspend’, $false, $false);
SetSuspendStateについて
AddTypeは外部システムのAPIを呼び出せます。それにより.Net FrameworkのSetSuspendStateを呼び出して実行します。SetSuspendStateは以下のように定義されています。
SetSuspendState (PowerState state, bool force, bool disableWakeEvent);
state 移行後の電源の動作モードを示す
force 強制的に中断モードにする場合は true
disableWakeEvent wake イベントでアクティブにならないようにするには true
休止モードとサスペンドモード
SetSuspendStateの1つ目のパラメータのstateは、Hibernateの場合は休止モード、Suspendの場合はサスペンドモードになります。休止モードはメモリの通電を切るので電源オフに近い状態です。一方のサスペンドモードは画面が消えるだけの省電力モードです。
省電力モードは復帰に時間がかかりますが、サスペンドモードはすぐ復帰できます。スリープといった場合、やりたいのは省電力モードでしょう。
そして2つ目のパラメータのforceは、あまり意味はありません。
SetSuspendStateのパラメータは正しく設定すること
3つ目のdisableWakeEventは重要で、これがtrueだとwakeイベントを無視するのでキーやマウスを入力しても復帰しません。そのためfalseにします。
SetSuspendState(‘Suspend’, $false, $false);としている理由は以上になります。スリープする場合は、1つめと3つ目のパラメータは正しく設定する必要があります。
rundll32.exeではスリープしないこと
ところがネットで、PowerShellでスリープする方法を調べると、以下のように書いている場合があります。
rundll32.exe PowrProf.dll,SetSuspendState
簡単なのでこれでやってしまいそうにいなりますが、SetSuspendStateのパラメータがありません。そうすると自動的に”休止モード”,true,trueになります。するとwakeイベントを受け付けず、キーやマウスで戻らず電源ボタンを押すしかなくなります。スリープでこれは意図していないでしょう。この方法でスリープするのはやめましょう。
PowerShellのSleepを活用しよう!
PowerShellのSleepを解説しましたが、ご理解頂けましたでしょうか。二種類のスリープについて解説しましたが、どちらもよく理解しておきましょう。
FEnetを運営しているネプラス株式会社はサービス開始から10年以上
『エンジニアの生涯価値の向上』をミッションに掲げ、
多くのインフラエンジニア・ネットワークエンジニアの就業を支援してきました。
ネプラス株式会社はこんな会社です
秋葉原オフィスにはネプラス株式会社をはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
インフラ業界に特化
ネットワーク・サーバー・データベース等、ITインフラ業界に特化。Cisco Systemsプレミアパートナーをはじめ各種ベンダーのパートナー企業です。
業界を知り尽くしているからこそ大手の取引先企業、経験豊富なエンジニアに選ばれています。
-
正社員なのにフリーランスのような働き方
正社員の方でも希望を聞いたうえでプロジェクトをアサインさせていただいており、フリーランスのような働き方が可能。帰社日もありません。
プロジェクト終了後もすぐに次の案件をご紹介させていただきますのでご安心ください。
-
大手直取引の高額案件
案件のほとんどが大手SIerやエンドユーザーからの直取引のためエンジニアの皆様へに高く還元できています。
Ciscoをはじめ、Juniper、Azure、Linux、AWS等インフラに特化した常時300件以上の案件があります。
-
スキルアップ支援
不要なコストを削減し、その分エンジニアの方へのスキルアップ支援(ネットワーク機器貸出、合格時の受験費用支給など)や給与で還元しています。
受験費用例)CCNP,CCIE:6-20万円、JNCIS:3-4万円、AWS:1-3万円など
※業務に関連する一定の資格のみ。各種条件がありますので詳しくは担当者へにお尋ねください。
-
現給与を保証します!※
前職の給与保証しており、昨年度は100%の方が給与アップを実現。収入面の不安がある方でも安心して入社していただけます。
※適用にはインフラエンジニアの業務経験1年以上、等一定の条件がございます。
-
インセンティブ制度
ネットワーク機器の販売・レンタル事業等、売上に貢献いただいた方にはインセンティブをお支払いしています。
取引先企業とエンジニア側、双方にメリットがあり大変好評をいただいています。
-
社会保険・福利厚生
社員の方は、社会保険を完備。健康保険は業界内で最も評価の高い「関東ITソフトウェア健康保険組合」です。
さらに様々なサービスをお得に利用できるベネフィットステーションにも加入いただきます。
-
東証プライム上場企業グループ
ネプラスは東証プライム上場「株式会社夢真ビーネックスグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
ネプラス株式会社に興味を持った方へ
ネプラス株式会社では、インフラエンジニアを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
オンライン面接も随時受付中。ぜひお気軽にご応募ください。


新着案件New Job
-
【高額年収】/【CCNA取得者歓迎】/ネットワークの構築/BIG-IP/東京都千代田区/【WEB面談可】/在宅ワーク/20代~30代の方活躍中
年収540万~540万円東京都千代田区(神保町駅) -
東京都中央区/【WEB面談可/インフラサーバ経験者/20~40代の方活躍中】/在宅ワーク
年収600万~600万円東京都中央区(小伝馬町駅) -
【高額年収】/インフラ構築支援/東京都港区/【WEB面談可/インフラサーバ経験者/20~40代の方活躍中】/在宅ワーク
年収960万~960万円東京都港区(新橋駅) -
ガバナンス推進、セキュリティ基盤支援/東京都港区/【WEB面談可】/在宅ワーク/20代~40代の方活躍中
年収780万~780万円東京都港区(新橋駅) -
カー用品販売会社の情報システム運用/東京都千代田区/【WEB面談可/インフラサーバ経験者/20~40代の方活躍中】/テレワーク
年収576万~576万円東京都千代田区(水道橋駅) -
ネットワーク構築、検証/東京都渋谷区/【WEB面談可】/テレワーク/20代~40代の方活躍中
年収540万~540万円東京都渋谷区(渋谷駅)