この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
対象OS:Windows 7/Windows 8.1/Windows 10/Windows Server 2008 R2/Windows Server 2012/Windows Server 2012 R2/Windows Server 2016
バッチファイルの中で、日付や時間をベースにしたファイル名を利用したい場合は少なくない。例えばシステムデータやユーザーファイルをバックアップし、バックアップ先のフォルダやファイル名に、その日の日付を反映した名前(例:「systemconfig-20180301」や「user1-180312」など)を付けたいといった場合である。
このような目的のためには、「date」や「time」などの変数を使えばよい(環境変数として参照する場合はそれぞれ「%date%」「%time%」と記述する)。それぞれ、今日の日付と現在の時刻を文字列にして返してくれる。
だがこれらの変数の返す値をよく見ると、文字列の途中に「/」や「:」といった、ファイル名としては利用できない文字が含まれている。ファイル名を生成する場合にはこれらの文字を取り除き、数字の部分だけを使う必要がある。
本TIPSでは、バッチファイルでdateやtimeなどの変数から日付と時刻の情報を抜き出して、ファイル名やフォルダ名として利用するためのテクニックを紹介する。
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」を指定すること。
nを省略すると、位置mから最後尾(文字列の右端)までとなる。例えば「%V:~5%」とすると、「FGHIJKL」となる。
mを省略すると、先頭からn文字の文字列となる。例えば「%V:~,5%」とすると、「ABCDE」となる。
mに負の数を指定すると、先頭ではなく、最後尾から数えた文字位置になる。例えば「%V:~-3%」とすると、最後の3文字「JKL」になる。
さらに、nに負の数を指定すると、最後のn文字を除いた部分、すなわち位置mからn文字目の直前までの文字列となる。例えば「%V:~5,-3%」とすると、「FGHI」となる。
もう1つ、文字列を置換する機能も用意されている。例えば「%V:DEF=12345%」とすると、「ABC12345GHIJKLM」となる(大文字/小文字は無視されるので「%V:def=12345%」でも同じ)。
以上をまとめると、次のようになる。
書式 | 意味 | 例 |
---|---|---|
%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」とする。この変数の値全体を参照するには「%V%」とする。変数名の修飾子として「:~<数値>」「:~<数値>,<数値>」「:~,<数値>」を付けることにより、文字列の一部分だけを取り出せる。「=」を使うと置換や削除もできる。修飾子の詳しい解説はコマンドプロンプト上で「set /?」を実行すると表示される。 |
以上の書式を使えば、「2018/03/05」のような文字列の入ったdate変数から数字の部分だけを抜き出すのは簡単だろう。次のようにして8文字の数字だけを取り出して、これらを全部結合すればよい。
実際には次のように表記する。
%date:~0,4%%date:~5,2%%date:~8,2%
実行すると次のようになる。
なお、コントロールパネルの[地域と言語]アプレット(あるいは[地域と言語のオプション]、[地域のオプション])で、日本以外の地域を選択したり、あるいは日付と時刻の形式をデフォルトから別のものに変更していたりすると、数字の位置が変わってしまう。すると日付や時刻が正しく抜き出せなくなることがあるので、注意が必要だ。
本TIPSの方法を利用する場合は、「echo %date%」でどのような結果が得られるか、まず確認してから利用していただきたい。
time変数から時刻の数字部分だけを抜き出すのも同じようにすればよいが、少し注意が必要だ。
午前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抑制)されて表示されている。
そのため、時間を取り出すために、単純に「%time:~0,2%%time:~3,2%%time:~6,2%」とすると、先頭に空白文字が入っている可能性がある。これをそのままファイル名やバッチファイルへの引数として利用すると、空白文字によって引数の区切りとして扱われるなどの不具合が生じる可能性がある。
このような不具合を防ぐためには、time変数に含まれる空白文字を、最初に数字の0に置き換えておけばよいだろう。変数の置換は先の表にあるように、「%V:s1=s2%」の書式を使う。この場合は、s1には空白1文字を、s2には「0」を指定して、「%time: =0%」とする。
「%time%」の内容をいったん変数time2に入れてから次の行で2桁ずつ取り出しているのは、文字列の置換と部分抽出を同時に行えないからである。
Copyright© Digital Advantage Corp. All Rights Reserved.