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

この記事は最新更新日から、3年以上経過しています。

概要

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

参考

Windowsのバッチファイルで曜日や日付によって処理を切り替える(VBScript併用編)
曜日や日付によってバッチファイルの処理を切り替えたいと思っても、バッチファイルの機能だけでこれを実現するのは容易ではない。しかしWSHを組み合わせれば、簡単に実現できる。曜日や日付に限らず、必要に応じてカスタマイズしたスクリプトを用意するこ...
バッチファイルでの試行錯誤を回避するためのメモ-または人類には早すぎた言語 - Qiita
草「それ海外だとアウトローですぅ」「ここではない何処かに行きたいだけなら、それでもいいですけど(ドヤァ)」「プログラミング言語に詳しくなるのは、もう生き甲斐のようなものなんです(ドヤァ)」「…

環境

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

おわり。