Windowsバッチ(.bat)で年月日、曜日、時分秒をテキストファイルに書き込み

概要

Windowsバッチファイル(.bat)で日時曜日、秒単位でテキストファイルに記録したい瞬間がありませんか? 私はありました。
タイムカードがない(かわりに手作業でエクセルを更新して退勤時刻を提出せよという)謎職場で退勤時刻を打刻したかったんです。

参考

Windowsのバッチファイルで曜日や日付によって処理を切り替える(VBScript併用編)
曜日や日付によってバッチファイルの処理を切り替えたいと思っても、バッチファイルの機能だけでこれを実現するのは容易ではない。しかしWSHを組み合わせれば、簡単に実現できる。曜日や日付に限らず、必要に応じてカスタマイズしたスクリプトを用意することもできる。
バッチファイルでの試行錯誤を回避するためのメモ-または人類には早すぎた言語 - Qiita
この記事の背景 最近、仕事でバッチファイルを書かざるを得ないという不幸な場面に遭遇しているのですが、これがまた、ものすごくどうでもいいことでハマることが多々あり、思わず「このWindows、壊れてる!」と思ったほどでした。犠牲者...

環境

Microsoft Windows 10 Home
Microsoft Windows [Version 10.0.19042.928]

コード

退勤間際にクリックすると、batと同じ階層にtime_record.txtというファイルを作成して下記のような記録を追記してくれます。

2021年05月06日(木)9:00:00~19:10:18 
2021年05月06日(木)9:00:00~19:10:32 

コードは下記の通り。適当にテキストエディタに貼り付けて拡張子を.batにして保存してください。

REM batファイルと同じ文字コードを設定しておくと、テキスト書き込み時に文字化けしなくなる(基本的にはsjisにしたほうがいい)
REM 文字コード設定 sjis
REM CHCP 932
REM 文字コード設定 utf-8
CHCP 65001

REM 「date」から切り出した数字をそれぞれ変数に代入
SET YEAR=%date:~0,4%
SET MONTH=%date:~5,2%
SET DAY=%date:~8,2%

REM 時を取得(%time% の先頭から2文字)
SET HOUR=%time:~0,2%
SET MIN=%time:~3,2%
SET SEC=%time:~6,2%

REM 曜日はwshでしか取得できないので曜日取得用ファイルを作成する
echo WScript.Quit(WeekDay(Date)) > %TEMP%\weekday.vbs & %TEMP%\weekday.vbs 
cscript /b %TEMP%\weekday.vbs

REM errorlevel内に曜日が数字で入るのでEQUで比較する(errorlevelは別のエラーが出ると上書きされてしまうのでweekに保存してそちらを比較)
SET week=%errorlevel%
IF %week% EQU 7 (
  SET WDAY=日
)
IF %week% EQU 6 (
  SET WDAY=金
)
IF %week% EQU 5 (
  SET WDAY=木
)
IF %week% EQU 4 (
  SET WDAY=水
)
IF %week% EQU 3 (
  SET WDAY=火
)
IF %week% EQU 2 (
  SET WDAY=月
)
IF %week% EQU 1 (
  SET WDAY=日
)

REM time_card.txtに追記する。
ECHO %YEAR%年%MONTH%月%DAY%日(%WDAY%)9:00:00~%HOUR%:%MIN%:%SEC% >> time_card.txt

REM 曜日出力用ファイルの削除
del /Q %TEMP%\weekday.vbs

おわり。