特定のファイルを「日付+時間」のファイル名でコピー

@echo off
rem 年月日時分の名前でファイルをバックアップ
rem 第一引数:コピー元ファイルのパス+ファイル名
rem 第二引数:コピー先ファイルのパス(最後に\は付ける)
rem _ 第二引数にファイル名の接頭辞を付けることも可
rem _ 例:"c:\abcde\BackUp_"と指定すればBackUp_200701011200.txt
rem -------------------------------------------
if "%1" == "" (goto ALERT)
if "%2" == "" (goto ALERT)
for /F "tokens=1-3 delims=/ " %%a in ('date /t') do SET DT=%%a%%b%%c
for /F "tokens=1-2 delims=: " %%a in ('time /t') do SET TM=%%a%%b
copy %1 %2%DT%%TM%.txt
goto END
:ALERT
@echo 引数を2つ指定して下さい
:END

使用例
上記をメモ帳に貼り付け、ファイル名を「backup.bat」として保存したとします。
ファイルの拡張子が表示されるよう設定されているか?拡張子を bat にして保存しているか?に注意して下さい。
backup "c:\コピー元ファイル.txt" "d:\バックアップファイル置き場\"
実行すると「バックアップファイル置き場」という名前のフォルダに「コピー元ファイル.txt」がコピーされます。
とてもやさしい説明:
@ を付けるとその行の命令自身をコマンドプロンプトに表示しません。
echo off はここから以後の命令をコマンドプロンプトに表示しないことを示しています。
rem はコメント。
2つの if は引数があるかのチェックです。 %1 は1つ目の引数という意味。
チェックに引っかかると goto で :ALERT のラベルまでジャンプします。
1つ目の for 文は、date /t で取得した年・月・日の3つのデータ(1-3)を SET コマンドで 変数 DT に格納します。
年・月・日のデータの区切りは "/"(スラッシュ)と " "(半角スペース)で認識するように delims で指定しています。
date コマンドは現在の年月日を yyyy/mm/dd で返し、現在年月日の入力を求め設定しなおすコマンドですが、 /t スイッチを入れることで年月日を返すだけになります。
2つ目の for 文も同じです。こちらは時・分の2つのデータ。
copy コマンドは copy [コピー元] [コピー先] の構文で、ファイルを複製します。ファイルのパスも含めて記述します。
コピー先ファイルは指定したものがなければ自動で新規作成してくれます。
%DT% と %TM% は先ほど for 文で作成した変数です。つまり、%2%DT%%TM% で、第二引数と年月日と時分が連結されます。
goto は指定されたラベルの位置にジャンプする命令です。goto END で :END のラベルへジャンプします。(エラー処理を飛ばす)
引数チェックに引っかかると ALERT ラベルに飛びますが、echo 〜 でエラーメッセージを出しています。
モア:
・バックアップバッチとして使うなら「指定時間にバッチを起動」と組み合わせて使うべきでしょう。
・単に "copy" を "move" に書き換えると、コピーではなくカット&ペーストになります。(コピー元からはファイルが無くなる)
・copy のところを例えば exp 文に変えればデータベースのバックアップバッチにもなりますねえ。
・copy コマンドで、コピー元ファイルは複数指定することもできます。
・xcopy に変えれば、フォルダーツリーをコピーできます。
例: XCOPY %1 %2%DT%%TM% /E /C /I (第二引数の最後に"\"はつけない)

ご意見・ご指摘等ございましたらお願い致します。(雑記帳へ
ホームページへ戻る