バッチファイルでポモドーロ・テクニックを使いたい

bat/cmd

概要

ポモドーロ・テクニックの本を読みました。

なんだか集中できて便利らしい、さっそく使おう! と思ったけどタイマーがなかった。
あるいは職場のWindowsに勝手にソフトを入れられないけど、ポモドーロ・テクニックを使いたいぞ! という瞬間がありますよね。
ダブルクリックでタイマーセットしたいだとか。
毎回4回のポモドーロ+30分休憩タイマーをかけるのが面倒だとか。

Windowsにもとから入ってるコマンドプロンプトを使ってポモドーロできないかな・・・と思った結果がこちらの記事になります。

メモ帳などのテキストエディタで.batファイルを作るだけでタイマーがかけられて便利です。

更新履歴

2021/01/25 終了時に警告音を鳴らせるようにした
2021/04/15 微妙だったコードを修正
2021/08/19 4回のポモドーロ+30分休憩用のbat作成

参考

バッチファイルでサブルーチンを定義する、別のバッチファイルを呼び出す (call, setlocal) | まくまくWindowsノート
天才星人まくのWindowsノート

作り方

作成方法は、メモ帳などのテキストエディタで下記のコードを書いて、拡張子を.batにします。

「新しいテキスト ドキュメント.txt」を「5min.bat」とか「25min.bat」とかいうファイル名にする感じです。
「.txt」「.bat」の部分が拡張子になります、環境によっては表示されないので、拡張子を表示してから変更しましょう。

あとは.batファイルをクリックするだけで秒数をカウントダウンしてくれるタイマーがかけられて便利です。
集中できないときとかにどうぞ。

コード

5分のポモドーロ(作業用)

@echo off
REM 25分のタイマーを掛けたい場合
set /a min=25

REM タイマーを秒数にする
set /a sec=%min%*60

REM タイマーを掛ける
timeout %sec% 

REM 終了時に音声を鳴らす
rundll32 user32.dll,MessageBeep

REM 終了時にアラートを出す
echo MsgBox "%min%分が経ちました。",vbInformation,"情報" > %TEMP%\msgbox.vbs & %TEMP%\msgbox.vbs 
del /Q %TEMP%\msgbox.vbs

5分のポモドーロ(休憩用)

@echo off
REM 5分のタイマーを掛けたい場合
set /a min=5

REM タイマーを秒数にする
set /a sec=%min%*60

REM タイマーを掛ける
timeout %sec% 

REM 終了時に音声を鳴らす
rundll32 user32.dll,MessageBeep

REM 終了時にアラートを出す
echo MsgBox "%min%分が経ちました。",vbInformation,"情報" > %TEMP%\msgbox.vbs & %TEMP%\msgbox.vbs 
del /Q %TEMP%\msgbox.vbs

時間指定できるポモドーロ

実行するとタイマーをかける時間(分)を入力できるタイプのポモドーロ

@echo off
REM タイマーを掛ける時間を入力する
set /p min="タイマーにセットしたい分数を入力してください:"

REM 1分のタイマーを掛けたい場合
REM set /a min=1

REM タイマーを秒数にする
set /a sec=%min%*60

REM タイマーを掛ける
timeout %sec% 

REM 終了時に音声を鳴らす
rundll32 user32.dll,MessageBeep

REM 終了時にアラートを出す
echo MsgBox "%min%分が経ちました。",vbInformation,"情報" > %TEMP%\msgbox.vbs & %TEMP%\msgbox.vbs 
del /Q %TEMP%\msgbox.vbs

4回のポモドーロ+30分休憩用

独学大全にも出ていた2時間30分のポモドーロを実現するbatファイルです。
これだけあればいいはず。
タイマー終了後のウィンドウでOKボタンか閉じるボタンを押さないと次のカウントが始まらない点に注意してください。

@echo off

REM 分数とカウント終了時の追加メッセージ
call :TimerFunc 25 "作業時間が終わり ました(1回目)"
call :TimerFunc 5 "1回目の休憩時間がおわりました。"
call :TimerFunc 25 "作業時間が終わりました(2回目)"
call :TimerFunc 5 "2回目の休憩時間がおわりました。"
call :TimerFunc 25 "作業時間が終わりました(3回目)"
call :TimerFunc 5 "3回目の休憩時間がおわりました。"
call :TimerFunc 25 "作業時間が終わりました(4回目)35分休憩です。"
call :TimerFunc 35 "4回目の休憩時間がおわりました。"
exit /b

REM ======Timer関数======
:TimerFunc
setlocal
REM 変数取得
set /a min=%1
set message=%~2

REM タイマーを秒数にする
set /a sec=%min%*60

REM タイマーを掛ける
echo %min%分のタイマー開始
timeout %sec%

REM 終了時に音声を鳴らす
rundll32 user32.dll,MessageBeep

REM 終了時にアラートを出す
echo %message%
echo MsgBox "%min%分が経ちました。%message%",vbInformation,"情報" > %TEMP%\msgbox.vbs & %TEMP%\msgbox.vbs
del /Q %TEMP%\msgbox.vbs

exit /b

解説

Windows7以降ならtimeout関数が使えるそうなのでそれを使ってカウントダウンしています。
timeout関数は引数の秒数だけ待機してくれる関数です。

これだけだと終了したかどうかがわからないので、アラートを表示させます。

警告音を鳴らすのにMessageBeepが使えます。

アラートはメッセージボックス表示させるvbsを作って実行、削除という方法で実現しています。

文字化けする場合は.batファイルの文字コードがshift-jisになっているか確認してみてください。
逆にコマンドプロンプトの文字コードがshift-jsでない場合も文字化けしたりします。

実行のようす(分数を指定するバージョン)

起動時

待機したい分数を入力してEnterを押すとカウントダウンが始まります。
(カウントダウン中になにかのキーを押すとアラートまで進んでしまうので、カウント中はウィンドウを最小化しておきましょう)

入力分数経過すると、vbsで作ったアラートが実行されます。

おわり。