#はじめに
タスクスケジューラなんて機能を使ってみたが、調べてもGUIの情報が多くCUIで行う記述が少なかったり、古かったので投稿してみた。
尚、概ね古い情報でも問題なかったりするので他に見やすいサイトがあればそちらへ。
もしくはcmdでschtasks /?
でヘルプが出ます。
#要件
- 定期的に定時でPCをシャットダウンさせたい
- 残業するときに突然シャットダウンすると困る
- コストをかけたくない(Windowsデフォルトの機能を用いる)
#タスクスケジューラ
タスクスケジューラとはWindows標準機能としてあり、GUI/CUI両方で作成することができる。
今回はbatに書き込み、それを実行することで作成・停止を一括で行うようにした。
#コマンド
set sd_time=19:30
set tsk="schtasks /Create /tn shdwn /tr '%0 sd' /sc once /st %sd_time% /F"
if "%1" == "" (
schtasks /Create /tn mk_shdwn /tr %tsk% /sc ONLOGON /F
) else (
shutdown /s /f /t 0
)
注:実行環境からコピペしたわけではないので間違いあったらすいません。
#使い方
- batファイルを適当な場所に置いて実行(ドキュメントとかデスクトップ下のほうが望ましい?)
- 実行すると「次回」ログオン時から
shdwn
を作成するmk_shdwn
を作成する。 -
shdwn
タスクがbatファイルに引数付きで呼び出すことによってシャットダウンを実行する。 - 残業する等でシャットダウンしてほしくない場合は再度batファイルを使用。
- batファイルの場所を変更した場合にも再度batファイルを使用
else文を書き換えたり、記述を追加すればシャットダウン時に別処理を入れることも可能。
引数を指定してログオン時の呼び出しも自信にすればbatファイル内に書き込んで複数の処理をかますことも可能。
#解説
いくつか解説必要かな?って思った部分のみ記述
希望次第で追加
##CUIタスクスケジューラで引数を記述する際
CUIのタスクスケジューラで呼び出すファイルはexeファイルの引数無しを想定しているのか、引数を直接書き込めない
誤:schtasks /Create /tn shdwn /tr shutdown /s /f /t 0 /sc once /st 19:30 /F
上のように書くと/sは引数に指定できません
みたいなエラーが出る。
なのでこの場合
正:schtasks /Create /tn shdwn /tr "shutdown /s /f /t 0" /sc once /st 19:30 /F
と、""
で囲まないといけない。
##1回使い捨てのタスクは残ったままになる
schtasks /Create ~ /sc once /st 〇:〇
だけで作成するとタスクが残り、同じ名前で作成できないため、/F
で強制的に作成をつける
##タスクスケジューラ内でタスクスケジューラを作成する
今回は親タスクを作り、子タスクを作成させる。子タスクは日によって削除する。という要件が必要だったために回りくどいことをしてさらに自信を子タスクから呼び出すなんてことをしている。
その際、上のCUIタスクスケジューラで引数を記述する際で話たように引数の問題が出るために""
で囲まないとエラーになる。さらに、その内部に""
で記述がある場合は''
に書き換えることで問題なく作成ができる。
#要望・改善点あればコメントください。
今回実装した機能を拡張したりしたら追記したいと思うし、他に解説してほしいものがあればコメントいただきたい。
また、batファイルも今回初めて記述したので記述方法が間違ってたりお作法等あれば教えてほしいです。
雑記
他にも作業はいろいろしているものの、さすがに仕事と直接かかわることは書けないのでしばらくは投稿ができない(仕事とは端末違うのでコピペできないからコード類は辛い)。
100本ノックは環境が変わりデータがすべてなくなった為に実行できる環境ができるまでは保留である。(またもう一度やり直したいとは思ってる)