検索
連載

Windowsのバッチファイル中で日付をファイル名に使用するTech TIPS(1/2 ページ)

バッチファイルの中で日付や時間をベースにしたファイル名を利用したい場合がある。このような用途では、%date%や%time%変数を利用して、ファイル名を合成すればよい。ただし、ファイル名に使えない文字は取り除きつつ、日付と時刻の情報を抜き出すテクニックが必要になる。

Share
Tweet
LINE
Hatena
「Tech TIPS」のインデックス

連載目次

バッチファイル中で日付をファイル名に使用する

対象OS:Windows 8.1/10/11、Windows Server 2012/2012 R2/2016/2019/2022


バッチファイル中で、数字や時刻などをファイル名として使いたい

 バッチファイルの中で、日付や時間をベースにしたファイル名のファイルを作成し、そこに結果を保存したいといった場合は意外と多いだろう。

 例えば、システムデータやユーザーファイルをバックアップし、バックアップ先のフォルダやファイル名に、その日の日付を反映した名前を付けたいといった場合である。例えば、「systemconfig-20221221」「user1-20230501」などと付ければ、いつバックアップしたかすぐ分かるだろう。

 本Tech TIPSでは、バッチファイル内で日付と時刻の情報を取得して、ファイル名やフォルダ名として利用するためのテクニックを紹介する。鍵となるのは「date」「time」という変数の扱い方である。

 まずバッチファイルの基本から知りたいなら、Tech TIPS「Windowsのバッチファイルの基本的な使い方」を参照していただきたい。

日付と時刻は変数「date」「time」から取得できるけど……

 バッチファイル内で現在の日付や時刻を扱うには、「date」や「time」などの変数を使えばよい。環境変数として参照する場合は「%date%」「%time%」と記述する。それぞれ、今日の日付と現在の時刻を文字列にして返してくれる。

現在の日付や時刻情報の取得
現在の日付や時刻情報の取得
dateやtimeなどの変数を使うことで、現在の時刻情報を取得できる。環境変数については「help set」コマンドを参照のこと。

 しかし、これらの変数の返す値をよく見ると、文字列の途中に「/」や「:」といった、ファイル名としては利用できない文字が含まれている。ファイル名を生成する場合にはこれらの文字を取り除き、数字の部分だけを使う必要がある。

環境変数から数字部分を抽出したり置換したりするには

 dateやtimeなどの変数から、数字の部分だけを取り出すには、単に「%date%」「%time%」とするのではなく、文字列の抽出/置換機能を使って、文字列の一部分だけを抽出すればよい。

 ある変数「V」の全体を参照するには「%V%」か「%v%」とする(大文字でも小文字でもよい)。これに対し、一部分の文字列を抽出するには「%V:‾3%」や「%V:‾1,2%」のように、「:‾」(コロンとチルダ)に続けて数字を指定する。

●文字列の一部を抽出するには

 ある変数の先頭(文字列の左端)からm番目の文字からn文字だけを取り出すには、「%V:‾m,n%」とする(mは0から始まる)。

 例えば変数Vの値が「ABCDEFGHIJKL」の場合、6文字目から2文字だけを取り出すには「%V:‾5,2%」とする。先頭文字は0番目と数えるので、「6」ではなく「5」を指定することに注意してほしい。

変数の一部を取り出す方法
変数の一部を取り出す方法
%V:‾m,n%」という表記方法を使うと、変数「V」から文字列の一部だけを取り出せる。

 nを省略すると、位置mから最後尾(文字列の右端)までとなる。例えば「%V:‾5%」とすると、「FGHIJKL」となる。

 mを省略すると、先頭からn文字の文字列となる。例えば「%V:‾,5%」とすると、「ABCDE」となる。

 mに負の数を指定すると、先頭ではなく、最後尾から数えた文字位置になる。例えば「%V:‾-3%」とすると、最後の3文字「JKL」になる。

 さらに、nに負の数を指定すると、最後のn文字を除いた部分、すなわち位置mからn文字目の直前までの文字列となる。例えば「%V:‾5,-3%」とすると、「FGHI」となる。

●文字列の一部を置換するには

 文字列の一部を置換する機能も用意されている。例えば「ABCDEFGHIJKL」に対して「%V:DEF=12345%」と指定すると、「ABC12345GHIJKLM」という文字列が取り出せる。大文字/小文字は無視されるので、「%V:def=12345%」でも同じだ。

 このとき、変数「V」そのものは置換されない。

変数の一部を置換する方法
変数の一部を置換する方法
%V:<対象文字列>=<置換文字列>%」という表記方法を使うと、変数「V」から文字列の一部を別の文字列に置換できる。

●文字列の抽出/置換のまとめ

 以上をまとめると、次のようになる。

書式 意味
%V% 変数Vの値全体 %V%」 ⇒ 「ABCDEFGHIJKL
%V:‾m% m文字目から、最後まで %V:‾5%」 ⇒ 「FGHIJKL
%V:‾m,n% m文字目から、n文字分 %V:‾5,2%」 ⇒ 「FG
%V:‾,n% 先頭から、n文字分 %V:‾,5%」 ⇒ 「ABCDE
%V:‾m,-n% m文字目から、最後のn文字分を除いたもの %V:‾5,-2%」 ⇒ 「FGHIJ
%V:‾-m% 後ろからm文字目から、最後まで %V:‾-5%」 ⇒ 「HIJKL
%V:‾-m,n% 後ろからm文字目から、n文字分 %V:‾-5,2%」 ⇒ 「HI
%V:‾-m,-n% 後ろからm文字目から、最後のn文字分を除いたもの %V:‾-5,-2%」 ⇒ 「HIJ
%V:s1=s2% 文字列s1を文字列s2に置換する。s2を省略すると、s1の削除になる %V:ABC=abc%」 ⇒ 「abcDEFGHIJKL
%V:ABC=%」 ⇒ 「DEFGHIJKL
%V:*s1=s2% 変数の先頭から文字列s1に一致する部分までをまとめて、文字列s2に置換する。s2を省略すると、一致した部分が削除される %V:*DEF=12345%」 ⇒ 「12345GHIJKL
%V:*DEF=%」 ⇒ 「GHIJKL
変数の部分文字列の抽出と置換
ここではVの値は「ABCDEFGHIJKL」とする。変数名の修飾子として「:‾<数値>」「:‾<数値>,<数値>」「:‾,<数値>」を付けることにより、文字列の一部分だけを取り出せる。「=」を使うと置換や削除もできる。

 「:〜」といった修飾子の詳しい解説は、コマンドプロンプト上で「set /?」を実行すると表示される。

date変数から日付の数字だけを抽出するには

 以上の書式を使えば、「2022/12/19」のような文字列の入ったdate変数から数字の部分だけを抜き出すのは簡単だろう。次のようにして8文字の数字だけを取り出して、これらを全部結合すればよい。

  • :先頭から、4文字分
  • :先頭より6文字目から、2文字分
  • :先頭より9文字目から、2文字分

 実際には次のように表記する。

%date:‾0,4%%date:‾5,2%%date:‾8,2%



 実行すると次のようになる。

日付変数から数字部分だけを抜き出す
date変数から数字部分だけを抜き出す
date変数の値から数字部分だけを抜き出して結合すると、有効なファイル名として利用できる文字列になる。

 もう1つの方法として、以下のように「/」を削除することでも同じ結果が得られる。年月日をそれぞれ抜き出す必要がない場合、こちらの方が単純で分かりやすい。

%date:/=%



 なお、[コントロールパネル]の[地域と言語](あるいは[地域と言語のオプション]、[地域のオプション])で、日本以外の地域を選択したり、あるいは日付と時刻の形式をデフォルトから別のものに変更していたりすると、数字の位置が変わってしまう。すると日付や時刻が正しく抜き出せなくなることがあるので、注意が必要だ。

 本TIPSの方法を利用する場合は、「echo %date%」でどのような結果が得られるか、まず確認してから利用していただきたい。

time変数から時刻の数字だけを抽出する

 time変数から時刻の数字部分だけを抜き出すのも、前述のdate変数と同じようにすればよい。ただし、少し注意が必要だ。

 午前0時から午前10時(00:00:59〜9:59:59)の場合、time変数が返す文字列の先頭には、「0」ではなく、空白文字が含まれている。具体的には、

00」「01」「02」……「09」「10」「11」……

ではなく、

0」「 1」「 2」……「 9」「10」「11」……

となる。つまり時(0〜9)の数値はゼロサプレス(0抑制)されて表示されている。

10:00より前の時刻表示に注意
10:00より前の時刻表示に注意
00:00〜09:59の時刻では、先頭に余計な空白文字が入っているので、これをファイル名の一部として使うと不具合を引き起こす可能性がある。

 そのため、時間を取り出すために、単純に「%time:‾0,2%%time:‾3,2%%time:‾6,2%」とすると、先頭に空白文字が入ることがある。これをそのままファイル名やバッチファイルへの引数として利用すると、空白文字によって引数の区切りとして扱われるなどの不具合が生じる可能性がある。

 このような不具合を防ぐためには、time変数に含まれる空白文字を、最初に数字の0に置き換えておけばよいだろう。変数の置換は先の表にあるように、「%V:s1=s2%」の書式を使う。この場合は、s1には空白1文字を、s2には「0」を指定して、「%time: =0%」(「:」と「=」の間に空白1文字があることに注意)とする。

 ただ、文字列の置換と部分抽出は同時に実行できない。そのため、「%time%」の空白を「0」に置換しつつ変数「time2」に代入した後、time2から時分秒の数字部分を抽出する。

set time2=%time: =0%
echo %time2:‾0,2%%time2:‾3,2%%time2:‾6,2%



先頭の空白を数字の0に置換する
先頭の空白を数字の0に置換する
ファイル名として利用するなら、時刻文字列に含まれる空白文字を数字の「0」に置換するとよい。

Copyright© Digital Advantage Corp. All Rights Reserved.

       | 次のページへ
PREVIEW
'; }else{ mask.innerHTML = '
画像をご覧いただくには会員登録が必要です
' + btn_txt + '
'; } if((_preview && location.hash.indexOf('maskoff') !== -1) || (typeof itmIdLogin !== 'undefined' && itmIdLogin == 1)){ img.style.visibility = 'visible'; }else{ nxt.parentNode.insertBefore(mask,nxt); } } } }; (function(d){ var _preview = d.domain.match(/(preview|broom|localhost)/); window.addEventListener('load',function(){ // islLogin 呼出済|preview if(d.getElementById('isLogin') || _preview){ mask_images({ sc:'0c1c43111448b131d65b3b380041de26f2edd6264ee1c371184f54d26ab53365', lc:'7d7179c146d0d6af4ebd304ab799a718fe949a8dcd660cd6d12fb97915f9ab0a', ac:'1a599d548ac1cb9a50f16ce3ba121520c8ab7e05d54e097bfa5b82cb5a328a0f', cr:'2c93f81754142e105c8bca17824745d14c8c4d69e9d7ede513e5530546e97641', bc:1 }); // islLogin なし }else{ var js = mask_images.setISLOGIN('//status.itmedia.co.jp/isLoginAIT.cgi','0c1c43111448b131d65b3b380041de26f2edd6264ee1c371184f54d26ab53365'); js.addEventListener('load',function(){ mask_images({ sc:'0c1c43111448b131d65b3b380041de26f2edd6264ee1c371184f54d26ab53365', lc:'7d7179c146d0d6af4ebd304ab799a718fe949a8dcd660cd6d12fb97915f9ab0a', ac:'1a599d548ac1cb9a50f16ce3ba121520c8ab7e05d54e097bfa5b82cb5a328a0f', cr:'2c93f81754142e105c8bca17824745d14c8c4d69e9d7ede513e5530546e97641', bc:1 }); }); } }); })(document);
LOADING
'; w.removeEventListener('scroll',arguments.callee,false); htmlRequest(_xhrfile,_idname); elem.setAttribute('data-status','true'); console.log('finished : ' + _idname); }else{ // console.log('retry : ' + _idname); } }else{ e_loader.innerHTML = '
LOADING
'; w.removeEventListener('scroll',arguments.callee,false); htmlRequest(_xhrfile,_idname); elem.setAttribute('data-status','true'); console.log('finished : ' + _idname); } } }; w.addEventListener('scroll',scrolling,false); // スクロールイベント scrolling(); // スクロールイベント(閲覧位置が半端な場合のために 1 回実行させる) }; w.addEventListener('load',loading,false); // LOAD 後に実装 };