タスクスケジューラを使って,自動的にスリープさせたり,スリープ解除させたいことがあるかもしれません。
例えば,毎日同じ時刻に自動的にパソコンを起動して音楽を再生し,その後,ある時刻に自動的にスリープさせるなどです。
しかし,ネット上で調べた限り,現在有効ではない方法ばかりが載せられており,Windows 10の最新版では動かない方法が広く流布されているようでした。
少なくとも,現時点で有効な日本語での情報はほどんど見当たりませんでした。
代表的なハマりポイントと回避策は以下の通りです。
・スリープ解除できるが,モニタがスリープから復帰できず,暗いままになってしまう。→WakeDisp2を使う。
・スリープ解除までに,数十秒かかることがあり,スリープ解除に失敗したと思い込んでしまう。→指定時刻から30秒程度待つ必要がある。
それで,数日かけて調べた,はまりどころを回避したタスクスケジューラの設定をまとめておきたいと思います。
Windows 10でタスクスケジューラを設定する際の前提
このページにたどり着いた方であれば,すでにご存じのことと思いますので細かい説明は割愛しますが,タスクスケジューラを使ってスリープ解除するためには,以下の設定を行う必要があります。
「タスクを実行するためにスリープを解除する」にチェックを入れる
電源オプションから「スリープ解除タイマーの許可」を「有効」にする
このあたりは,色々なページで解説されていますので,問題ないかと思います。
Windows 10でタスクスケジューラからスリープ解除できなかった無効な方法
さて,うまくいかない方法から説明したいと思います。
以下の方法がかなり流布されているのですが,これはWindows 10の最新版において,すでに無効な方法となっています。
rundll32.exeを使う方法
以下のコマンドがスリープに入れるためのコマンドとしてよく載っているのですが,この方法でスリープに入れると,タスクスケジューラでスリープを解除することができません。
rundll32.exe powrprof.dll,SetSuspendState Sleep
PowerShellのコマンドで,キーやマウスの入力操作をスケジュールする
スリープ解除時に,PowerShellでマウスの移動やキー入力を疑似的に実行する方法が書かれていたりしますが,これでは,ユーザーからのインタラクティブな入力操作とは見なされず,スリープ解除,あるいはモニタのスリープ解除を実現させることができません。
suspend.exeを使ったスリープ解除の方法
あるサイトで配布されているRubyを元にしたsuspend.exeという実行ファイルですが,これも,現時点では,動かないように思います。少なくとも私の最新版のWindows 10の環境では,タスクスケジューラでスリープ解除させることができませんでした。
BIOSの設定
BIOSの起動設定を見直してみることが勧められていたりもしますが,これは,BIOSでスケジュールした時刻に電源を入れるという,全然別の話です。スリープ解除には特に影響を及ぼしませんので,BIOSまわりで時間を浪費するのはやめましょう。
Windows 10のタスクスケジューラでスリープ解除するためにたどり着いた結論
さて,ここからが成功した方法ですが,まずは,PowerShell ISEを一般ユーザーの権限で実行します。管理者権限で実行する必要はありません。何をやっているか意味が分かる方であれば,もちろん管理者で実行しても問題ないです。
そして,以下のPowerShellをコピペして実行してください。緑色の三角アイコンが実行ボタンです。
$script = '$signature = @"
[DllImport("powrprof.dll")]
public static extern bool SetSuspendState(bool Hibernate,bool ForceCritical,bool DisableWakeEvent);
"@
$func = Add-Type -memberDefinition $signature -namespace "Win32Functions" -name "SetSuspendStateFunction" -passThru
$func::SetSuspendState($false,$true,$false)'
$bytes = [System.Text.Encoding]::Unicode.GetBytes($script)
$encodedCommand = [Convert]::ToBase64String($bytes)
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-encodedCommand $encodedCommand"
$trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 1 -At 08:09
Register-ScheduledTask -TaskName "Sleep" -Action $action -Trigger $trigger -Force
$action = New-ScheduledTaskAction -Execute "cmd.exe" -Argument "/c echo hello"
$settings = New-ScheduledTaskSettingsSet -WakeToRun
$trigger = New-ScheduledTaskTrigger -Daily -DaysInterval 1 -At 08:12
Register-ScheduledTask -TaskName "WakeUp" -Action $action -Settings $settings -Trigger $trigger -Force
すると,タスクスケジューラの画面に,下図のように2つのタスクが登録されますので,これらのタスクをダブルクリックして,実行日時や頻度を好みに調整していきます。平日だけにするのか,どんなプログラムを起動時に実行するのか,などです。
ちなみに,Sleepタスクの下図の設定において,-encodedCommandの後に,エンコードされた長いパラメーターが付されていることを確認してください。
もし,上図のようにパラメーターが空っぽであれば,PowerShellの実行権限が不十分ですので,PowerShell ISEを管理者で立ち上げて実行するなど試してみてください。その場合,タスクスケジューラも管理者として実行する必要があるかもしれません。
もし,上述のPowerShellコマンドが何をやっているのか知りたい方は,以下のMicrosoftのページを参照してください。SetSuspendStateの設定方法が肝心です。
WakeUpタスクの中では,スリープ解除のために「コマンドプロンプトを一瞬立ち上げてhelloと出力する」というタスクを仕込んであります。ですので,ユーザーの目に触れることはありません。
もちろん,このWakeUpタスクを編集して,「ブラウザを立ち上げ特定のURLを表示する」といったタスクに置き換えても問題ありません。
スリープ解除をテストする際に十分な待ち時間を設ける
これも結構ハマるポイントだと思います。
例えば,スリープ解除を9:00に設定したとします。すると,実際にスリープ解除が実行されて,コンピューターが立ち上がり始めるのは,9時00分30秒ぐらいだったりします。スペックによっては,15秒ぐらいのこともありますし,30秒以上かかることもあります。
それで,テストする際には,指定時刻を過ぎたからと言って,すぐに諦めて手動でスリープ解除してしまうのではなく,30秒ぐらい経ってからスリープ解除動作が始まることもあると思っていてください。
タスクスケジューラでスリープ解除できるようになったがモニタが点かない
次に直面しがちなのは,タスクスケジューラでスリープ解除できるようになったものの,モニタが点かないという症状です。
これも,かなり色々な方法を試しましたが,最終的には,WakeDisp2というフリーソフトを使うのがベストという結論になりました。
PowerShellでマウス入力やキー入力を疑似的にスケジュールしてみたりもしたのですが,それはモニタの点灯に影響を与えることができませんでした。
常駐型のフリーソフトを入れるなど気持ちが悪いので,何とかWindows 10のネイティブな機能で実現できないか格闘しましたが,振り返ってみれば,さっさとWakeDisp2入れておけばよかったという感想です。
WakeDisp2は,以下のページからダウンロードできます。
https://ux.getuploader.com/open2ch1/download/716
ダウンロードボタンが小さくて分かりづらいので,図示しておきます。
ダウンロードボタンをクリックした後,ウイルススキャンが走るので,その後もう一度,ダウンロードボタンを押す必要があります。
これを,適当な場所に置き,実行します。設定等は一切不要です。
タスクトレイに常駐するソフトですが,インストールは不要ですし,特に悪影響を心配するような挙動はありませんので,問題ないです。
これで,タスクスケジューラからスリープ解除した際に,モニタが点くようになりました。
WakeUpタスクがずっと「実行中」になってしまう場合
これは余談ですが,例えば,WakeUpタスクにおいて,ブラウザを立ち上げる等のプログラムの開始をスケジュールしたとします。
その場合,スリープ解除してブラウザは立ち上がったものの,タスクスケジューラ内において,タスクのステータスがずっと「実行中」になってしまうということがあります。
これは,コマンドの指定の仕方で回避することができます。
まず,以下の1行をコピペしてテキストファイルに貼り付け,OpenChrome.batなどと名前を付けて保存します。最後の行にexitとか書かなくても大丈夫です。
start "" "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" "https://www.msn.com/"
このコマンドの意味は「コマンドプロンプトを空白のタイトルで立ち上げ,続くコマンドを実行する」という命令です。
そして,そのbatファイルを実行するというタスクを設定します。
こうすることで,「実行中」というステータスのままになってしまうことを避けられるかもしれません。
もちろん,普通にプログラムを実行するだけで問題ない場合も多々あります。それで,タスクが「実行中」のままになってしまって困っている場合に,一つの方法として試してみてください。
以上,Windows 10において,タスクスケジューラでスリープやスリープ解除を設定するためのハマりどころと,その回避策でした。
悩んでいる方の参考になればと思います。他にも個々の状況に応じて乗り越えるべき課題があると思いますが,質問があればコメント欄にどうぞ。
コメント
記事について大変参考になりました。ありがとうございます。
1点質問がありメールを差し上げました。
現在Lenovoの古いノートパソコンをカバーを閉じた状態で外部モニターを接続して使用しています。(Windows10、「カバーを閉じた状態:何もしない」、「スリープ:30分」に設定)
夜中等、パソコンを使用していない時は自動でスリープさせたいため、こちらの記事で書かれたSleepとWakeUpタスクを試してみましたがスリープになりません。
「カバーを閉じた状態:何もしない」でスリープさせたり、解除することはできないでしょうか?もし対応方法があれば教えていただけないでしょうか?
お手数をおかけしますが、アドバイスのほどよろしくお願いします。
なるほど,確かにそういう状況もありそうですね…
すぐに思いつく解決策はないのですが,問題切り分けのため,まずはカバーを開いた状態であれば,問題なくスリープのスケジュールが動作するかどうか,教えていただけるでしょうか?
ご返信ありがとうございます。
カバーを開けた状態ではスリープになることは確認しています。ただ、カバーを開けた状態でスケジュール通りスリープ、解除するかは確認しておりませんので、確認してご連絡します。
ありがとうございます,私も興味がある分野ですので,何かお気づきの点がございましたらシェアしていただければ幸いです。
ご参考までに、rundll32.exeを試してみましたが、ご説明の通り、スリープに入りますがスリープは解除しません。電源ボタンを押すと解除されます。
以上、よろしくお願いします。
やはりそうなんですね…。rundll32.exeの方法は,現在は有効ではないのに,まだネット上に情報が残っているのでハマってしまいました。だいぶそれに時間を浪費した記憶があります。
いろいろアドバイスありがとうございます。
カバーを開けた状態でスケジュール通りスリープ、解除するかについては今晩確認しますので、結果は明日ご連絡します。
ご参考までに、現在使用しているパソコンはLenovo Z575(2012年製)です。もう買い替えてもいい製品ですが、主な使用目的はRadikoのいろいろな番組を録音するため、負荷も少ないことから使っています。課題は録音時間がバラバラであることで、空き時間にスリープさせて少しでも延命させたいと思い、お伺いしている限りです。
パソコンを買い替えても、ノートパソコンで外部モニーを使用する場合を同じ問題が発生する可能性があるためアドバイスいただければありがたいです。
そういう需要はありそうですね。お試しいただいた結果,お待ちしております。
お世話になります。
カバーを開けた以下の条件で試してみましたが、いずれもディスプレイはオフしますが、電源はオフしません。以前は電源はオフしましたが、今回はオフしていないので、タスクの問題ではなく、そもそも電源の問題なのかもしれません。
①カバーを開けている、カバーを閉じた状態:何もしない
②カバーを開けている、カバーを閉じた状態:スリープ
③再起動、カバーを開けている、カバーを閉じた状態:スリープ
本記事とは関係ない原因かもしれませんが、何かアドバイスがありましたらよろしくお願いします。
色々と調べてみたのですが,「カバーを閉じた状態:何もしない」に設定しておけば,カバーの開閉状況はタスクの実行に影響を及ぼさないように思いました。
ですので,あとはスリープのタスクスケジュールが正常に動作するかどうかにフォーカスできそうです。
英語にはなってしまいますが,「カバーを閉じた状態」は英語OSでは,”When I close the lid”ですので,そのあたりのキーワードで調べていくと,似たようなケースが幾つか散見されました。解決策までは見つけることが出来ていませんが,そのような方法で調べていくこともできるかもしれません。
ご意見ありがとうございます。
まずはカバーを開けた状態でスリープできるようにしています。その上で、カバーを閉じた状態でスリープできるか試してみます。
また何か変化がありましたらご連絡させていただきます。
ありがとうございます。他の方にも参考になることがあると思いますので,続報ございましたら,お待ち申し上げております。
いくつかアップデートがありましたので、以下の通りご報告します。
1.カバーを閉じた状態でスリープ
以下2点がスリープを邪魔していることが判明、設定変更したところ、カバーを
閉じた状態でもスリープが可能となった
・ラジオ録音ソフトのスリープ設定(ソフト起動中はスリープブロック)
・マイク/スピーカードライバー
2.タスクスケジューラでのSleep、Wakeup
一番やりたかったラジオの予約録音は以下設定に変更して使用。
予約録音はできるが、タスクスケジューラが起動せず録音を逃すことが散発
・スリープ設定解除
・スリープはタスクスケジューラで制御(予約録音前でWakeup、録音後Sleep)
・ラジオ録音ソフトでスリープ設定なし(予約録音のみ)
3.今後の課題
予約録音の取逃し防止(継続して原因調査が必要)
今後は自分で調査していきますが、また何かありましたら相談にのっていただくようお願いします。ありがとうございました。
ご丁寧に知らせてくださり,ありがとうございました。
他の方にも役に立つ情報だと思います。
また,何かお力になれるテーマがございましたら,コメントいただければ幸いです。
すみません、ご質問させて下さい。
当方、Windows10デスクトップPCでモニターを2台接続し、モニターを拡張して使用している者です。
記載の記事を参考に指定時刻にスリープ解除させることに成功したのですが、これもご記載の通り、モニターが映らなくなってしまいました。
幸い、なんとか複製していたサブモニターをメインへ切り替え、WakeDisp2をインストールすることで、なんとかメイン(もとのサブ)モニタが復帰できることは確認できましたが、それでも旧メインのモニターは付かない状態のまま変わりません。
あまり知識なくやってしまった当方に問題はありますが、非常に困っております。。。
片方のモニターを従来通り付くようにするには、どうすればよいか、ご教授頂けませんでしょうか。
よろしくお願い致します。
なるほど…デュアルディスプレイの場合に,片方だけモニタが映らないという症状ですね。
ちょっと私の環境では再現できないので,なんとも言えないところではあるのですが,どのようにデュアルモニタを構成しておられるかによって,注目するポイントは変わってくるように思います。
例えば,後付けのグラボなどを用いて,セカンドモニターを接続しているのであれば,そのグラボを目覚めさせるためのひと手間が必要なのかもしれません。
あるいは,マザーボードに,HDMI端子がデフォルトで2つ以上存在するようなPCを使っておられるのであれば,Windows上のひと手間で解消できるのかもしれません。
色々なシナリオが考えられますので,ちょっと的を射たアドバイスをするのが難しくはありますが,もし何かお気づきのことがありましたら,コメントしていただけると,同様の症状の方にとって役立つ情報になるかもしれません。
管理人様、早々のご連絡ありがとうございます。
記載時はこちらも慌てていた手前、確かに情報不足ではございました事、申し訳ございません。
ご質問後にいろいろ試しまして、結果的に自力解決に至りました。
当方の接続環境としては、ご記載の「後付けのグラボなどを用いて,セカンドモニターを接続している」状態です。
以下のことを試みました。
1:マウス等の動作からディスプレイとして認識はされていることを確認。
2:グラフィックドライバは生きていることを確認。
3:映らないディスプレイのケーブルをPCより抜く。
4:ディスプレイ設定より複製設定を解除し、1モニターのみにする。
5:ハイブリッドスリープ無効化。
6:高速スタートアップ無効化。
7:PC再起動(=No5,6の設定反映)
8:PCシャットダウン
9:映らないディスプレイのケーブルをPCへ再度接続
10:PC起動時に両ディスプレイの点灯を確認
人によってはPowerShellによる”ハイバネーション機能の再起動”が必要パターンもある様ですが、当方は不要でした。
また上記でもダメな場合は、グラボ再インストールやBIOS編集が必要みたいです。
以上になります。
結果的に大変参考になる記事で助かりました。ありがとうございます!
ご丁寧に情報を記してくださり,ありがとうございます!
きっと,同様の症状がある方にとって参考になると思います。
ありがとうございました!
こんばんは。とても参考になりました。
しかし1つだけ上手くいかないことがあります。
スリープ解除はできるのですが、サインイン画面になってしまいます。家でのみ使っているPCなので、パスワードは設定していないのですが、サインインというボタンを押さないとデスクトップにいけません。
何か対処法はありますか…?
このURLの情報などを参考に試してみるとどうでしょうか?
https://www.itmedia.co.jp/pcuser/articles/1509/25/news019.html
返信遅くなり申し訳ありません。
Windowsの設定の、アカウント→サインインオプション→サインインを求める
のところで、「もう一度Windowsへのサインインを求めるタイミング」を常にオフに設定したらできました!
ありがとうございました。
無事に設定できたようで,よかったです。
コメントありがとうございました。
[…] https://macruby.info/windows-10/windows10-task-scheduler… […]
[…] https://macruby.info/windows-10/windows10-task-scheduler… […]
[…] くわからずこちらの記事を参考に、動作するのを確認しました。https://macruby.info/windows-10/windows10-task-scheduler-sleep-wake.html#toc9なお筆者は、上記の記事で紹介されているスリープ復帰した後に […]
こんにちは。
記事を参考にし、設定させていただきました。
実現したいことはシンプルに指定時間でのスリープ、およびスリープ解除となります。
(Windows10 ver.22H2 HPのノートパソコン)
動作確認をしたところ、1点問題が発生しており、もしご存じでしたらご教授ください。
指定時間でのスリープ解除を実施した直後になぜか毎回シャットダウンの処理が走ってしまいます。
イベントビューアからログを確認しても正常なシャットダウン処理(イベントID:7002,6006)がされており、異常なログは発生しておりません。
また設定として
18:30 スリープ
07:30 スリープ解除 とした場合上記事象が発生しますが、
18:30 スリープ
19:00 スリープ解除 など、間を短くして設定をすると上記事象は発生しません。
なにか要因として考えられることがありましたら是非ご教授をお願いいたします。