本章では、ファイル名に現在の日付を付けるバッチファイルを作成します。例としては、「資料名.txt」を「20160720_資料名.txt」にするような感じです。
それでは始めましょう。
その他の関連しそうな記事
現在の日時を取得する
ファイル名に日時を設定するには、まず現在の日時を知る必要がありますが、バッチには「date」と「time」という便利な変数があります。
「第6章」フォルダの中でコマンドプロンプトを開き、以下のように入力して下さい。
1 2 |
echo %date% echo %time% |
現在の日付と時間が表示されたと思います。「date」と「time」は現在の日付と時間を持った変数であり、「%」で囲んで変数の中身を表示させています。
前回の講義で学んだ変数は「set」コマンドを使って自分で中身を作っていました。しかし、このようにはじめから何かしらの値を持っている変数がいくつかバッチには存在します。
文字列から欲しい部分を切り取る
ここでの目的はファイル名の頭に現在の日付を付け加えることです(例:20170213_ファイル名.txt)。「%date%」を使って、ファイル名に日付を付け加えればよいだろうとことは分かりますが、このままではファイル名には使えない文字「/」が含まれているので直接は使えません。
そこで、文字列から欲しい部分だけを切り取る操作を学びましょう。
以下のコマンドをコマンドプロンプトから実行して下さい。
1 2 3 4 5 6 |
set string=ABCDEFG echo %string% echo %string:˜2% echo %string:˜2% echo %string:˜2,3% |
1行目では変数「string」に「ABCDEFG」を代入しています。2行目で「string」の中を表示し、「ABCDEFG」が正しく代入されたことを確認します。
4行目以降が文字列を切り取って表示させたものです。「string」のあとに「:˜2」とありますが、これは前の二文字を除くという意味です。ですので、表示は「AB」を除いた「CDEFG」となっていることが分かると思います。
5行目では、「:˜-2」とマイナスが付いています。これは後ろから数えて2文字目より前を除くという意味であり、コマンドプロンプトへの表示は「ABCDE」が除かれた「FG」となります。
最後に6行目での「:˜2,3」は前の2文字を除き、残った文字列から3文字分を取ってくる指示になります。表示は「CDE」です。
以下、実行結果を示しています。
文字列の切り取り操作に関しては、「文字列を自在に切り取る -やりたいことから検索-」が詳しいので参考にして下さい。
ファイル名で使用する日付を作る
これで、必要な知識は揃いました。ファイル名で使用できる日付を作ってみましょう。
バッチファイル「add_date.bat」を「第6章」フォルダに作成し、以下のように記述して下さい。
1 2 3 4 5 6 7 8 |
@echo off set year=%date:˜0,4% set month=%date:˜5,2% set day=%date:˜8,2% set date2=%year%%month%%day% echo %date2% |
実行して、今日の日付が「20160722」のような形式で出力されれば成功です。
バッチファイルの3行目が「年」部分の切り出しです。はじめに「%date%」を0文字除き(つまり何も除かない)4文字分を取ってきて変数「year」に代入します。
4、 5行目も同様にして「月」、「日」の部分を取り出し、それぞれ変数「month」と「day」へ代入しています。
6行目で変数「date2」に文字列を結合した最終的な形を代入しています。
1行目に書いた「@echo off」はこれ以下に書いたコマンドを実行時に表示させないという指示を与えるものです。
試しに、「@echo off」を書かないものと実行結果を比較して下さい。「@echo off」を付けずに実行した方は、バッチファイルに書いたコマンドが一つずつコマンドラインに表示されていきます。
一方、「@echo off」を付けるとコマンド表示は消え、出力指示をしている「echo」での表示のみが残ります。
このように、出力をスッキリさせたい場合に「@echo off」は有用です。自分で作成したバッチファイルには必ずと言ってよいほど、「@echo off」を指定します。
ファイル名の頭に日付を加えるバッチファイル
「test.txt」ファイルを「20160720_test.txt」のようにファイル名変更するバッチファイルを作るには、変数「date2」を元のファイル名の前に付け加えるだけでよいでしょう。
「add_date.bat」を以下のように変更します。
1 2 3 4 5 6 7 8 |
@echo off set year=%date:˜0,4% set month=%date:˜5,2% set day=%date:˜8,2% set date2=%year%%month%%day% copy %1 %date2%_%1 |
最後の8行目にcopyするコマンドを新たに加えただけです。「%1」を使って、操作対象となるファイルを引数として与えるようにしました。
テスト用に「第6章」フォルダの下に「test.txt」を作って、コマンドプロンプト上で
1 |
add_date.bat test.txt |
と打ってください。
「20160722_test.txt」が作成されましたか?(※日付部分は実行した日によって変わります)
元のファイルを残したくない場合は、「copy」ではなく以下のように「rename」を使うとよいでしょう。以下のように変更します。
1 2 3 4 5 6 7 8 |
@echo off set year=%date:˜0,4% set month=%date:˜5,2% set day=%date:˜8,2% set date2=%year%%month%%day% rename %1 %date2%_%1 |
「rename」コマンドはコピーするのではなく、名前を変更するコマンドです。
第6章 まとめ
今回はファイル名に日付を加えるための必要な知識として、変数「date」や「time」には現在の日時が入っていることを知り、それを必要な部分だけ切り取る方法を学びました。
また、余計な出力をさけるための指示「@echo off」も重要なコマンドです。
【入門講義 第6章のまとめ】
- その1 変数「date」と「time」には現在の日時が入っている
- その2 文字列の切り取りを学んだ
- その3 「@echo off」の指定で、コマンドプロンプトへの出力をスッキリさせる
なにか不明な点やうまくいかない場合は、「お問い合わせフォーム」からお気軽にお問い合わせ下さい。
次章では、一つのバッチファイル内で複数の処理からユーザが好きなものを選択できるようにするための「if文」を勉強します。
勉強に活用させて頂いており大変助かっています。
1点だけ気になりコメントします。
[文字列から欲しい部分を切り取る]の切り取り例の5行目について、
echo %string:˜2%でなくecho %string:˜-2%かと思います。
ご確認お願いします。
“最後に6行目での「:˜2,3」は前の2文字を除き、残った文字列から3文字分を取ってくる指示になります。表示は「CDE」です。”
とありますが、画像では
“後ろからの~~”
との誤りがあります。
@echo off記述したものと@echo off記述していないものとを比較したところ、
出力される結果がなぜか異なります。
@echo offを消した場合は、YYYYMMDDの形式になりますが、@echo offを付けた場合は、なぜか、062021/01/06という形式なってしまいます。
恐らくdateが前に読み込まれて、その後、YYYY/MM/DDとなっているように思います。
間違っているようには思えないのですが、、、
@echo off
set year = %date:~0,4%
set month = %date:~5,2%
set date = %date:~8,2%
set date2=%year%%month%%date%
echo %date2%