バッチファイルで YYMMDD_HHMMSS みたいな現在日付時刻文字列をつくる

ファイル名に日付時刻文字列を入れたい場合などに重宝する。

バッチファイル実装

以下のようにする。

@echo off
setlocal

set shortdate=%date:/=%
set shortdate=%shortdate:~2,6%

set time_0padding=%time: =0%
set shorttime=%time_0padding::=%
set shorttime=%shorttime:~0,6%

set shortdatetime=%shortdate%_%shorttime%
echo %shortdatetime%

最終的に欲しいのは %shortdatetime% 変数。それ以外は導出過程。

解説

一言で言うと、環境変数の date と time から日付時刻文字列を取り出し、それを(色々と文字列処理を工夫して) YYMMDD_HHMMSS フォーマットに変更している。

現在日付時刻の取り方

環境変数 %date%%time% で取れる。

$ echo %date%
2018/07/23

$ echo %time%
16:35:06.57

ただし %time% は時(Hour)が一桁の時に 09 ではなく 9 みたいなスペース埋めであり、使いづらいので、 置換記法でスペースを0に置換させる

$ echo %time%
 9:12:34.56

$ echo %time: =0%
09:12:34.56

置換記法

%date:/=%

これは date 変数中にある「/」を空文字列に置換する、つまり削除するという意味。

以下に例を示す。

$ echo %date%
2018/07/25

$ echo %date:/=%
20180725

一般論で書くと以下のようなフォーマットになる。

%変数名%

  ↓ こう書く

%変数名:置換前の文字=置換後の文字%

スライス記法

%shortdate:~2,6%

これは shortdate 変数中にある2文字目から6文字分を取り出す、という意味。

以下に例を示す。

$ echo %date%
2018/07/23

$ echo %date:~0,4%
2018

$ echo %date:~5,2%
07

$ echo %date:~8,2%
23