Loading
連載
» 2015年07月01日 05時00分 UPDATE

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

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

[打越浩幸, 島田広道,デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

対象OS:Windows 2000/Windows XP/Windows Vista/Windows 7/Windows 8/Windows 8.1/Windows 10/Windows Server 2003/Windows Server 2008/Windows Server 2008 R2/Windows Server 2012/Windows Server 2012 R2



解説

 バッチファイル中で、日付や時間をベースにしたファイル名を利用したい場合は少なくない。例えばシステムデータやユーザーファイルをバックアップし、バックアップ先のフォルダーやファイル名に、その日の日付を反映した名前(例:「systemconfig-20150701」や「user1-150701」など)を付けたいといった場合である。

 このような目的のためには、環境変数の「date」や「time」を使えばよい(環境変数として参照する場合はそれぞれ「%date%」「%time%」とする)。それぞれ、今日の日付と現在の時刻を文字列にして返してくれる。

C:\>echo %date%
2015/07/01

C:\>echo %time%
14:54:08.22



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

 そこで本TIPSでは、バッチファイルでdateやtime変数から日付と時刻の情報を抜き出して利用するためのテクニックを紹介する。

操作方法

●環境変数から数字部分を抽出する

 dateやtime変数から、数字の部分だけを取り出すには、単に「%date%」「%time%」とするのではなく、変数値の部分文字列抽出用の修飾を行えばよい。

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

 例えば変数Vの値が「ABCDEFGHIJKL」の場合、6文字目から2文字分取り出すには「%V:~5,2%」とすればよい(先頭文字は0番目と数えるので、「6」ではなく「5」を指定する)。

C:\>set V=ABCDEFGHIJKL

C:\>echo %V:~5,2%
FG



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

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

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

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

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

書式 意味
%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%」とする。また、変数名の修飾子として「:~<数値>」「:~<数値>,<数値>」「:~,<数値>」を付けることにより、文字列の一部分だけを取り出せる。修飾子の詳しい解説はコマンドプロンプト上で「set /?」を実行すると表示される。ここではVの値は「ABCDEFGHIJKL」としている。

●date環境変数から日付の数字だけを抽出する

 以上の書式を使えば、「2015/07/01」のような文字列の入ったdate変数から数字の部分だけを抜き出すには、

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

 すなわち、

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



とすればよいことが分かるだろう(年と月と日の部分をそれぞれ抜き出して結合している)。

C:\>echo %date%
2015/07/01

C:\>echo %date:~0,4%%date:~5,2%%date:~8,2%
20150701



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

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

Windows 2000のdate環境変数に注意

 本文では、「%date%」の結果が例えば「2015/07/01」という場合の文字列処理の方法を解説した。ところが(非常に古いOSである)Windows 2000では、「%date%」の結果が「2015/07/01」ではなく、「水 2015/07/01」というように、先頭に曜日を表す文字が含まれている。

 このような文字列の入ったdate変数から数字の部分だけを抜き出すには、

  • 年: 最後尾より10文字目から、4文字分
  • 月: 最後尾より5文字目から、2文字分
  • 日: 最後尾より2文字目から、2文字分

すなわち、

%date:~-10,4%%date:~-5,2%%date:~-2,2%



とすればよいことが分かる。

C:\>echo %date%
水 2015/07/01

C:\>echo %date:~-10,4%%date:~-5,2%%date:~-2,2%
20150701



 この方法であれば、Windows 2000のようにdate変数の先頭に曜日が入る場合でも、あるいはWindows XP以降のWindows OSのように曜日が入らない場合でも、そのまま利用できる。


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

 日付の場合と同様に、時刻(時分秒)の場合にも少し注意点がある。

 午前0時から午前10時(00:00:59〜9:59:59)の場合、time変数が返す文字列の先頭には、「0」ではなく、空白文字が含まれている(「00」「01」「02」……「09」「10」「11」……ではなく、「 0」「 1」「 2」……「 9」「10」「11」……となる)。つまり時(0〜23)の数値はゼロサプレスされて表示されている。

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

C:\>time 1:23

C:\>echo %time%
 1:23:04.29

C:\>time 12:34

C:\>echo %time%
12:34:01.60



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

C:\>echo %time:~0,2%%time:~3,2%%time:~6,2%
 11204   ……置換しない場合は、このように先頭に空白文字が含まれる

C:\>set time2=%time: =0%   ……いったん一時変数に入れて置換する

C:\>echo %time2:~0,2%%time2:~3,2%%time2:~6,2%
011204   ……先頭に空白文字は含まれず、必ず数字が入る



 なお、「%time%」の内容をいったん変数time2に入れてから次の行で2桁ずつ取り出しているのは、文字列の置換と部分抽出を同時に行えないからである。

       1|2 次のページへ

Copyright© 1999-2016 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

編集部からのお知らせ

@IT編集部では、編集記者を募集しています。ご興味のある方は奮ってご応募ください。

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。