タスクスケジューラで定時退社(残業可)


はじめに

タスクスケジューラなんて機能を使ってみたが、調べてもGUIの情報が多くCUIで行う記述が少なかったり、古かったので投稿してみた。
尚、概ね古い情報でも問題なかったりするので他に見やすいサイトがあればそちらへ。

もしくはcmdでschtasks /?でヘルプが出ます。

要件

  • 定期的に定時でPCをシャットダウンさせたい
  • 残業するときに突然シャットダウンすると困る
  • コストをかけたくない(Windowsデフォルトの機能を用いる)

タスクスケジューラ

タスクスケジューラとはWindows標準機能としてあり、GUI/CUI両方で作成することができる。
今回はbatに書き込み、それを実行することで作成・停止を一括で行うようにした。

コマンド

tsk.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
)

注:実行環境からコピペしたわけではないので間違いあったらすいません。

使い方

  1. batファイルを適当な場所に置いて実行(ドキュメントとかデスクトップ下のほうが望ましい?)
  2. 実行すると「次回」ログオン時からshdwnを作成するmk_shdwnを作成する。
  3. shdwnタスクがbatファイルに引数付きで呼び出すことによってシャットダウンを実行する。
  4. 残業する等でシャットダウンしてほしくない場合は再度batファイルを使用。
  5. 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本ノックは環境が変わりデータがすべてなくなった為に実行できる環境ができるまでは保留である。(またもう一度やり直したいとは思ってる)