バッチファイル:ファイル名に使える「年月日_時分秒」を1行で得る方法


バッチファイルでファイル名に日付と時刻を組み合わせたものを使ってあれこれしたかったのでいろいろ調べてみました。

環境変数から日付と時刻を得る


まずはコマンドウィンドウで環境変数の内容をだしてみます。

環境変数DATE

C:\>echo %DATE%
2015/03/27

環境変数TIME

C:\>echo %TIME%
 7:10:36.37

ファイル名に「年月日_時分秒」を使いたいときは「%DATE%_%TIME%」とすればよいはず、、、

C:\>echo %DATE%_%TIME%
2015/03/27_ 7:13:50.13

この結果にはいくつかの問題点があります。

まずはWindowsのファイル名に使えない文字が入っていること。

日付区切りの「/」と時刻区切りの「:」はファイル名に使えません。

これらを消せばファイル名としては使えますが、ファイル名の中には半角スペースは入れたくないので時間の前に含まれている半角スペースもなんとかしないといけません。

さらに秒までは必要ですが小数点以下の秒までは必要ありませんし、ピリオドはファイル名に含ませたくありません。

環境変数から必要な部分のみ切り出す方法


Windows TIPS:バッチ・ファイル中で日付をファイル名に使用する - @IT

必要な部分のみ切り出す方法はこのページが詳しいです。

変数から文字列を切り出す方法を利用して環境変数のDATEとTIMEから必要な部分を切り出して組み合わせて使います。

C:\>echo %DATE:~-10,4%%DATE:~-5,2%%DATE:~-2,2%
20150327

切り出す文字の位置を負の数で指定しているのはWindows2000の場合はDATEの先頭に曜日が含まれるからだそうです。

C:\>echo %DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
20150327

WindowsXP以降なら先頭の文字列から数えて切り出す方法で問題ありません。

C:\>echo %DATE:/=%
20150327

単に「/」を取り除くだけなら置換機能を使ったほうが短いコマンドになります。

今度は時刻の処理です。

C:\>echo %TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
 73456

日付のときと同じようにTIME変数から必要な部分を切り出す方法では先頭に半角スペースが含まれてしまいます。

Windows TIPS:バッチ・ファイル中で日付をファイル名に使用する - @ITでは半角スペースを0に置換したTIMEの内容を一旦変数に収めてから取り出す方法が紹介されています。

DOSコマンドの変数操作は入れ子にできないので、どうしてもコマンドが2行にわたってしまいます。

ファイル名に使える日付と時刻を1行のコマンドで取り出す方法


置換と切り出しの変数操作を入れ子にできないことが、1行のコマンドに収められない原因ですのでfor /Fコマンドを使って入れ子にします。

C:\>for /F "tokens=1,2,3 delims=:" %p in ('echo %TIME: =0%') do @echo %p%q%r
085934.13

まず%TIME: =0%で時刻の前の半角スペースを0に置換してechoで出力した結果をコロン「:」を区切りとして時分秒をそれぞれ変数pqrで取り出しています。

秒の小数点以下は不要なのでさらにfor /Fを入れ子にしてピリオドの前の部分だけを取り出します。

C:\>for /F "tokens=1 delims=." %x in ('^(for /F "tokens=1,2,3 delims=:" %p in ^('echo %TIME: =0%'^) do @echo %p%q%r^)') do @echo %x
090732

とっても長いコマンドですが1行で時分秒が取り出せました。

入れ子の中にするfor /Fコマンドの括弧は「^」でエスケープしています。

C:\>for /F "tokens=1 delims=." %x in ('(for /F "tokens=1,2,3 delims=:" %p in ('echo %TIME: =0%'^) do @echo %p%q%r^)') do @echo %x
091156

エスケープが必須なのは閉じ括弧「)」なのでこのようにしても問題ありませんがあとで読み返すときにちょっとわかりにくいかもしれませんね。

日付部分は「/」を置換すればよいだけですので、「日付_時分秒」を取り出すには%DATE:/=%を追加するだけでできます。

C:\>for /F "tokens=1 delims=." %x in ('^(for /F "tokens=1,2,3 delims=:" %p in ^('echo %DATE:/=%_%TIME: =0%'^) do @echo %p%q%r^)') do @echo %x
20150327_091728

これで必要な「年月日_時分秒」が1行で取り出せました。

一番最後のdoのあとの%xにこの形式の日付日時が入っていますので、echoのコマンドのところをやりたいコマンドに変えればすべて1行で収まるはずです。

バッチファイルの中ではfor /Fの中の変数の%%%にしないといけません。
for /F "tokens=1 delims=." %%x in ('^(for /F "tokens=1,2,3 delims=:" %%p in ^('echo %DATE:/=%_%TIME: =0%'^) do @echo %%p%%q%%r^)') do @echo %%x

参考にしたサイト


BATファイルで文字列の切り出し
左端の文字は0字目と数えることに注意。そのあとに取り出す文字数を指定します。

Windows TIPS:バッチ・ファイル中で日付をファイル名に使用する - @IT
2行を使ってファイル名に使える日付時刻を得る方法。

For - DOS コマンド一覧
サンプル10を参考にDOSコマンドの1行で「年月日_時分秒」の取り出し方を思いつきました。
PR

0 件のコメント:

コメントを投稿