【初心者向け】windowsバッチファイルで繰り返し休憩を通知するタスクを作ってみた

コラム

障害対応という仕事柄、私はうっかりしていると休憩が遅れたり、取り損ねることがよくあります。

そこで以前から欲しかった「休憩を繰り返し通知するタスク」をwindowsのバッチファイルで作ってみましたので、自分の備忘も含めてまとめます。

繰り返し休憩を通知するバッチファイルの要件

欲しかったバッチファイルの機能をまとめると、以下のようになります。

バッチファイルの要件

  • 音ではなく、視覚で通知する(夜勤もあるので、休憩中の人を起こしたくない)
  • スヌーズ機能を付けたい(障害対応中はすぐに休憩できないため)
  • PC作業中に確実に気づくようにしたい(うっかりタイミングを逃すことを避けたい)
  • 自動で繰り返し動作して欲しい(セット忘れ防止。また、セットの手間を省きたい)

バッチファイルの内容と動作

バッチファイルの内容は以下のようになります。

@echo off
rem 古いタスクを一旦削除する
schtasks /delete /tn break_timer /f

:loop
    rem 文字入力を受け付けます
    set /p ANSWER= "給水の時間です!給水しましたか?(Y/N)"
    if /i {%ANSWER%}=={y} (goto :yes)
    if /i {%ANSWER%}=={yes} (goto :yes)
    if /i {%ANSWER%}=={n} (goto :no)
    if /i {%ANSWER%}=={no} (goto :no)
    echo Y/Nで答えてください!
    goto :loop

:yes
    rem 休憩がとれた場合
    schtasks /create /tn break_timer /sc minute /mo 120 /tr "C:Usershihiyamabatbreak_timer.bat"
    echo 120分後にもう一度実行します!
    timeout 15
    exit

:no
    rem 休憩が取れない場合
    schtasks /create /tn break_timer /sc minute /mo 10 /tr "C:Usershihiyamabatbreak_timer.bat"
    echo 10分後にもう一度実行します!
    timeout 15
    exit

 

処理1:エコー機能をOFFにする

エコー機能がONになっていると、バッチファイルで実行されているコマンドなど、途中結果が全て表示されてしまいます。

そこで、以下のコマンドでエコー機能をOFFにします

@echo off

処理2:タスクを削除する

まず、既に休憩を通知するタスクが作られていた場合、古いタスクを一旦削除します。内容は以下のとおりです。

rem 古いタスクを一旦削除する
schtasks /delete /tn break_timer /f

 

「rem」で始まる部分は、コメントです。

タスクの削除は「schtasks /delete /tn break_timer /f」部分

分解して解説すると、以下のようになります

タスク削除の詳細

  • 「schtasks /delete」
    →既に存在するタスクを削除します
  • 「/tn break_timer」
    →「/tn」の後ろに削除するタスクの名前を指定します。例だと「break_timer」というタスクを削除します
  • 「/f」
    →削除時に表示される警告メッセージを非表示にします

schtasksコマンドについては、以下のサイトで詳細に解説されていますので、編集して利用する場合は、参考になります。

処理3:文字入力で条件分岐させ、スヌーズ機能を実装する

次に、スヌーズ機能の設定です。

スヌーズ機能については、文字の入力で判定させることにしました。以下の部分です。

:loop
    rem 文字入力を受け付けます
    set /p ANSWER= "給水の時間です!給水しましたか?(Y/N)"
    if /i {%ANSWER%}=={y} (goto :yes)
    if /i {%ANSWER%}=={yes} (goto :yes)
    if /i {%ANSWER%}=={n} (goto :no)
    if /i {%ANSWER%}=={no} (goto :no)
    echo Y/Nで答えてください!
    goto :loop

 

処理3-1:setコマンドで文字の入力を受け付けて、変数に格納する

まず、setコマンドでメッセージを表示しつつ、ユーザーの入力した値を変数に格納します。上記コードだとこの部分。

set /p ANSWER= "給水の時間です!給水しましたか?(Y/N)"

 

この方法でsetコマンドは、環境変数の値や格納、削除に利用できるコマンドです(詳細はこちら)。

「set /p 変数名="文字列"」とすると、"文字列"を表示して、ユーザーに値の入力を促すことができます。

処理3-2:ifで処理を分岐させる

続いて、入力された値に応じて、処理を分岐させます。具体的には以下の部分。

if /i {%ANSWER%}=={y} (goto :yes)
if /i {%ANSWER%}=={yes} (goto :yes)
if /i {%ANSWER%}=={n} (goto :no)
if /i {%ANSWER%}=={no} (goto :no)

 

変数については、「%」で囲むことで、変数として扱います

また、「if /i」とすると、大文字と小文字の区別をなくして判定できます(ifコマンドの詳細はこちら)。

この分岐では「y」か「yes」の入力ならyesのラベル、「n」か「no」の入力ならnoのラベルへ飛ぶように分岐します(入力の大文字・小文字は判断しません)。

処理3-3:「yes」「no」の入力がなかった場合、再入力させる

「yes」「no」の入力がなかった場合、再入力を促します。以下の部分です。

echo Y/Nで答えてください!
goto :loop

 

「echo Y/Nで答えてください!」によって、「Y/Nで答えてください!」とユーザーに注意喚起します。

その後「goto :loop」によって「:loop」の部分(全体の5行目)まで戻り、ユーザーへ再入力をさせます

処理4:時間指定して処理を実行するタスクを生成する

「yes」を入力した場合、2時間後にもう一度休憩を取るように通知させます。

具体的には、120分後にこのバッチファイルをもう一度実行するよう、タスクを生成します。具体的には、以下の部分です。

:yes
    rem 休憩がとれた場合
    schtasks /create /tn break_timer /sc minute /mo 120 /tr "C:Usershihiyamabatbreak_timer.bat"
    echo 120分後にもう一度実行します!
    timeout 15
    exit

 

「schtasks /create /tn break_timer /sc minute /mo 120 /tr “C:Usershihiyamabatbreak_timer.bat"」の部分がタスクを生成する処理です。

分解して解説すると、以下のようになります

タスク生成の詳細

  • 「schtasks /create」
    →タスクを生成します
  • 「/tn break_timer」
    →「/tn」の後ろに生成するタスクの名前を指定します
  • 「/sc minute /mo 120」
    →120分ごとに実行するように設定します。「120」の部分を変更すると、「何分毎」の指定を変えられます
  • 「/tr “C:Usershihiyamabatbreak_timer.bat"」
    →実行するコマンドを指定します。例では「"C:Usershihiyamabatbreak_timer.bat"」を指定して、該当のバッチファイルを実行します

例では120分に1度休憩するようにしていますが、「VDT作業ガイドライン」では「連続作業は1時間を超えないこと」とされているので60分(休憩も含めて70~75分)としてもいいでしょう(現実にこれ守れる職場って無いと思うけど…)。

タスク生成後、処理を実行した旨を「echo」で通知し、その文字が画面に一定時間残るように「timeout」を利用しています。例では「timeout 15」となっており、15秒は文字が画面に残ります。この表示は、ユーザーが文字を入力することで、消すこともできます。

最後に「exit」でバッチスクリプトを終了します。

補足:PC起動時にバッチファイルを起動させたい場合

今回、実行するバッチファイルは “C:Usershihiyamabatbreak_timer.bat"のように、「"」で囲んでいます。実行するバッチファイルについては、必ずしも「"」で囲む必要はありませんが、パスの途中に半角スペースなどが含まれる場合、「"」で囲んで文字として判断させる必要があります

PCを起動した際、自動でバッチファイルを実行したい場合、Windowsならスタートメニューの配下に置く必要がありますが、スタートメニューのフォルダ名は「Start Menu」なので、「"」で囲んで指定し、半角スペースも含めて文字列扱いするようにしましょう。

処理5:noを選んだ場合の処理

「yes」の場合とほぼ同様の処理です。

休憩を取れない場合、10分スヌーズすることにしたので、タスクの実行タイミングを「/sc minute /mo 10」に変更しています

windowsバッチファイルで繰り返し休憩を通知するタスクの使用例

実際に作ったものがこんな感じ。

windowsバッチファイルで繰り返し休憩を通知するタスクの実行例

見た目はかなり地味ですが、目的は達成できました。

休憩通知タスクを使った感想

正直「無いよりまし」といったところです。

障害対応という緊急性のため、忙しい時はまともな休憩を取れないまま10時間以上仕事することもあります。また、仕事机に飲食物を持ち込むこともできません。冷蔵庫まではロックのかかった扉を3枚抜ける必要があります。

そういった環境のために「早めに細かな休憩の必要性に気付ける」という点ではメリットがありますが、本格的に動けなくなるとスヌーズが延々と繰り返されます(諦めてスヌーズを使わないときも…)。

そんなわけで、自分にとってはあまり仕事向きではありませんが、自宅ではそこそこ役立っているので作って良かったといったところ。

またschtasksコマンドを利用することで、日勤・夜勤に応じて時間を変更させてタスクを生成する」ということにも応用できたので、仕事にも若干は貢献できたかと思います。