業務で使用するタイマーをコマンドプロンプトで作成したので紹介します。
※修正版を作成しました↓ 変更点のみ説明しているので、基本は本記事で確認してください。
タイマー機能はWindowsに標準で搭載されていますし、タスク管理関連のタイマーアプリやWebサービスもたくさんありますが、今回はコマンドプロンプトで自分なりに使いやすいものを作ってみました。
今回作成したプログラムの特徴は、
・時間を分単位で毎セッション指定できる
・各セッションの完了時に全ウィンドウが最小化されることで確実に時間がきたことに気が付く
・各セッションごとに実施した作業を入力できる
・ユーザーが終了を選択した時点でプログラムを終了できる
・終了時点までに実施したセッションの情報をログとして保存できる
という点です。
特にログ機能については日報や週報の作成時に役に立つはずなので、ぜひ試してみてください。
Topics
機能
ユーザー入力で指定した時間(分で指定)を入力します。
入力した時間が経過するとWindowを全て最小化してセッションが終了したというメッセージが表示されます。
コンソールにこのセッションで実施した業務をユーザー入力するよう表示されるので、簡潔に入力します。
つぎに、続ける(Y)もしくは終了する(N)か聞かれるので、希望の選択肢を入力します。
続けた場合は、最初と同様に時間のユーザー入力を求められますので、入力すれば次のセッションを開始ことができます。
終了を選んだ場合は、各セッションの開始時間、実施時間、入力した業務内容、全セッションの合計時間がログとして保存されます。
終了時のコンソールはこのような感じです。
計測中は残り時間が秒で表示されます。
保存されたログはこのような感じです。
使用シチュエーション
1日の最初に起動し、業務終了まで起動しっぱなしを想定しています。
セッション中はとにかく仕事に集中するように心がけます。
時間が来ると全てのウィンドウが最小化するので、確実に時間になったことに気がつきます。
セッションが終了したら自由に休憩し、好きなタイミングで次のセッションを開始してください。
セッション終了時の業務内容の入力では、後で見返すことを想定して記入します。
最後のセッションが終わったらプログラムの終了を選択し、業務を終えます。
プログラム終了と同時にログファイルが保存されますので、週報や日報の作成時に見返してみるといいでしょう。
各セッションの開始時間や、タイマーでカウントした総時間もログファイルに記載されるので、どの程度集中して仕事ができたかを確認するのにも役立つと思います。
ログファイルはTimerLog_日にちという名称で保存されます。
同日に2回以上プログラムを起動してログを保存しても、既存同名ファイルの内容の下に追記されることになりますので、問題ありません。
スクリプト
それではさっそくスクリプトを紹介します。
@echo off
setlocal enabledelayedexpansion
REM ログファイルの作成(日付を取得)
for /f "tokens=1-4 delims=/ " %%a in ('echo %date%') do (
set "day=%%a"
set "month=%%b"
set "year=%%c"
)
set "log_file=C:\保存したいフォルダのパス\TimerLog_!year!!month!!day!.txt"
REM セッション番号の初期化
set "session=1"
set "total_duration=0"
:session_start
REM ユーザーに時間(分)の入力を求める
set /p "waiting_time=Session !session!: How Long(min): "
REM 指定された分数を秒に変換
set /a "waiting_time_seconds=!waiting_time!*60"
REM セッション開始時の時間を取得
for /f "delims=" %%t in ('echo %time%') do set "session_start_time[!session!]=%%t"
REM セッション時間を格納
set "session_time[!session!]=!waiting_time!"
REM 時間を計測
timeout /t %waiting_time_seconds% /nobreak
REM 終了時間を取得
for /f "delims=" %%t in ('echo %time%') do set "session_end_time[!session!]=%%t"
REM ウィンドウを全て最小化
powershell -command "(New-Object -ComObject Shell.Application).MinimizeAll()"
REM セッションの終了をメッセージで通知
msg * "Session !session! has ended.
REM 実施した業務内容を入力をユーザーに求める
set /p "task[!session!]=what did you do?: "
REM セッション終了後に継続確認
set /p "continue_session=Session !session! end. Continue? (Y/N): "
if /i "%continue_session%"=="Y" (
REM セッション番号の繰り上げ
set /a "session+=1"
set /a "total_duration+=waiting_time"
goto :session_start
) else (
REM ログファイルに書き込み
echo Date: %year%%month%%day%>>%log_file%
for /l %%i in (1, 1, !session!) do (
echo Session%%i starts: !session_start_time[%%i]! ends: !session_end_time[%%i]! Duration: !session_time[%%i]!-min Did: !task[%%i]!>>%log_file%
)
set /a "total_duration+=waiting_time"
echo Total: !total_duration!-min>>%log_file%
)
echo Completed. Log has been saved in %log_file%.
スクリプト解説
@echo off
setlocal enabledelayedexpansion
最初のおまじないみたいなものですね。
コンソールが文字でいっぱいにならないように実行時にコードを表示しないと言う指示と、スクリプト内の変数を実行時に置き換える、という指示になります。
REM ログファイルの作成(日付を取得)
for /f "tokens=1-4 delims=/ " %%a in ('echo %date%') do (
set "day=%%a"
set "month=%%b"
set "year=%%c"
)
ここでは日付の情報を取得しています。
set "log_file=C:\保存したいフォルダのパス\TimerLog_!year!!month!!day!.txt"
取得した日付の情報を使ってログファイルの名称を設定しています。
REM セッション番号の初期化
set "session=1"
set "total_duration=0"
最初のセッション番号の変数を作成して1で設定、合計作業時間の変数作成し0で設定しています。
:session_start
ここでは繰り返し実行するコードのスタート地点を設定しています。
REM ユーザーに時間(分)の入力を求める
set /p "waiting_time=Session !session!: How Long(min): "
REM 指定された分数を秒に変換
set /a "waiting_time_seconds=!waiting_time!*60"
ここではユーザーに計測したい時間を入力してもらえるようにしています。
入力された数字がwaiting_timeという変数に保存されます。
次のコードでは入力された時間(分)を秒に変換しています。
REM セッション開始時の時間を取得
for /f "delims=" %%t in ('echo %time%') do set "session_start_time[!session!]=%%t"
REM セッション時間を格納
set "session_time[!session!]=!waiting_time!"
ここではログに記載するためにセッションを開始した時間を取得しています。
また、各セッションごとの作業時間を記録するための変数を作成し、入力された時間を格納しています。
REM 時間を計測
timeout /t %waiting_time_seconds% /nobreak
REM 終了時間を取得
for /f "delims=" %%t in ('echo %time%') do set "session_end_time[!session!]=%%t"
最初の文では入力された秒数を計測しながら待機する指示となっています。
タイムアウトすると次のコマンドが実行されるので、この時点での時間を計測して保存するようにしています。
REM ウィンドウを全て最小化
powershell -command "(New-Object -ComObject Shell.Application).MinimizeAll()"
REM セッションの終了をメッセージで通知
msg * "Session !session! has ended.
タイムアウトしたことをユーザーに知らせるために、まずは開いている全てのウィンドウを最小化するようにしています。
作業中のウィンドウが最小化するのでいやでも気がつきますね。
さらにダメ押しでセッションが終了したことを知らせるメッセージをポップアップで表示するようにしました。
REM 実施した業務内容を入力をユーザーに求める
set /p "task[!session!]=what did you do?: "
最後にセッション中に実施した業務を入力するようユーザーに求めています。
入力した内容はログで確認をすることができます。
REM セッション終了後に継続確認
set /p "continue_session=Session !session! end. Continue? (Y/N): "
次のセッションに進むかここで終了するかを確認します。
if /i "%continue_session%"=="Y" (
REM セッション番号の繰り上げ
set /a "session+=1"
set /a "total_duration+=waiting_time"
goto :session_start
) else (
REM ログファイルに書き込み
echo Date: %year%%month%%day%>>%log_file%
for /l %%i in (1, 1, !session!) do (
echo Session%%i starts: !session_start_time[%%i]! ends: !session_end_time[%%i]! Duration: !session_time[%%i]!-min Did: !task[%%i]!>>%log_file%
)
set /a "total_duration+=waiting_time"
echo Total: !total_duration!-min>>%log_file%
)
ユーザー入力がYの場合はセッション番号を繰り上げ、作業合計時間の変数に直前の作業時間を加算し、設定したコードの開始時点に戻ります。
ユーザー入力がY以外の場合は以下の内容をログファイルを作成して保存します。
- 日にち
- 各セッションごとの
- 開始時間
- 終了時間
- 作業時間
- 作業内容
- 合計作業時間
echo Completed. Log has been saved in %log_file%.
最後に終了のメッセージを表示して終了です。
まとめ
今回は業務時間を管理するバッチファイルのコードを紹介しました。
作業時間や作業内容をログファイルとして残すことができるので、週報や日報の作成に役立てていただければと思います。
コードは必要に応じて修正して使っていただければ。