はじめに
筆者は、寝付きがあまり良くないので、音楽をかけたり、動画サイトを見たりしながら、寝ております。
(それが原因で、寝付きが良くないのかもしれないですが)
そのため、すごい昔(たぶんWindows98の頃)にダウンロードしたシャットダウンタイマーを使って、いつ寝てしまっても自動的に、PCをシャットダウンするようにしていました。
流石に、そんな古いツールを使い続けるのもどうかな、と思って自分で作ることにしました。
会社でも、帰宅直前に大きすぎる圧縮ファイルの解凍完了を待つ、のような状況に使えます。
(そんな状況、そうそうないですが)
今回は、以下を参考にさせていただきました。
コマンドプロンプトで sleep するためのテクニック - Qiita
成果物
今どき、誰もDOSコマンドを覚えたい、ということはないだろうと思うので、
まずは作ったバッチファイルの内容を載せます。
ファイル名は好きに変えてください。(拡張子は除く)
まずは、タイトル通りにシャットダウンタイマーから。
後半のtaskkill
コマンドは、シャットダウン時にひっかかる(強制終了するか聞かれる)ようなプロセスがありそうな方だけ、実行すればいいです。
@echo off
set /p in=シャットダウンまで何分?:
for /f %%f in ('time /t') do set tm=%%f
set /a hr = %tm:~0,1% * 10 + %tm:~1,1%
set /a mn = %tm:~3,1% * 10 + %tm:~4,1% + in
set /a hr = hr + (mn / 60)
set /a mn = mn %% 60
set /a hr = hr %% 24
set mn=0%mn%
set mn=%mn:~-2,2%
for /l %%n in (%in%, -1, 1) do (
echo. %%n 分
title シャットダウン %hr%:%mn% [残り %%n 分]
ping -n 61 localhost >nul
)
taskkill /f /im "chrome.exe"
shutdown -f -s -t 0
一応、ログオフ(サインアウト)タイマーも。
表示文言と、shutdown
コマンドのオプション以外は同じです。
@echo off
set /p in=ログオフまで何分?:
for /f %%f in ('time /t') do set tm=%%f
set /a hr = %tm:~0,1% * 10 + %tm:~1,1%
set /a mn = %tm:~3,1% * 10 + %tm:~4,1% + in
set /a hr = hr + (mn / 60)
set /a mn = mn %% 60
set /a hr = hr %% 24
set mn=0%mn%
set mn=%mn:~-2,2%
for /l %%n in (%in%, -1, 1) do (
echo. %%n 分
title ログオフ %hr%:%mn% [残り %%n 分]
ping -n 61 localhost >nul
)
taskkill /f /im "chrome.exe"
shutdown -f -l
DOSコマンド詳細
- set
- /pオプションで、ユーザー入力を変数に代入。
- /aオプションで、数式の計算結果を変数に代入。
- /aオプションでの数式内では、変数を
%
や!
で囲まなくても、変数の値になる模様。
- for
- /fオプションで、コマンド実行結果の各行を使ったループ。今回は
time /t
の出力が、hh:mm
の1行であるため、1回しかループしない。
- /fオプションで、コマンド実行結果の各行を使ったループ。今回は
- title
- DOS窓自体のキャプション変更。DOS窓をいちいち開かなくても、いつシャットダウン/ログオフするか分かるようにするため、使用。
- ping
- 詳細は コマンドプロンプトで sleep するためのテクニック - Qiita を参照してください。
- taskkill
- /fオプションで、強制終了。
- /imオプションで、イメージ名(≒exeファイル名)を指定。
終わりに
筆者は、ソースコードの「縦」を揃えるのが大好きです。
そのため、変数名の文字数もなるべく統一するのですが、日付や時刻に関する変数名には絶望します。。。