• 締切済み

最新更新日のBATファイルコピーについて。

最新更新日のBATファイルコピーについて。 どなたか教えてください。 BATを夜間スケジュール化して、あるファイルをコピーするBATを作成したいのです。 条件は (1)コピー元フォルダ C:TEST フォルダ以下に(2)~(4)のファイルがあります。 (2)コピー元ファイル名 AAABBB20101001.txt (3)コピー元ファイル名 AAABBB20101002.txt (4)コピー元ファイル名 AAABBB20101003.txt   **ファイル名の日付部分のみが可変です。 (5)コピー先 D:TESTBKK (6)コピー後ファイル名 AAABKK.txt (4)のみをコピーし(6)のファイルとして上書きコピーするbatを作成したいのです。 自分でも下記のbatを作成したみました。 @ECHO OFF SET LOGPATH=C:\test FORFILES /P %LOGPATH% /M AAA*.txt /C "cmd /c COPY /y C:\test D:\test\AAABKK.txt" /D 0 最新日付のみをコピーしたつもりが、すべてのファイルがAAABKK.txtに追加された 状態で出力されていました。どなたかアドバイスをお願いします。 他に違う作成方法があれば教えてください。

みんなの回答

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

> (5)SRC?? などの用語がわかりません。 SRC=source の略。コピーなどを行う時のコピー元、などを示す名前としてよく使われます。 DST=destination の略。コピーなどを行う時のコピー先、などを示す名前としてよく使われます。 > (4)usebackq?? for のオプション usebackq は、in 以下に記入した内容の意味を指定するオプションです。 http://www.atmarkit.co.jp/fwin2k/operation/command008/command02.html usebackq を指定した場合、バッククオート(`)で囲まれた文字列をコマンドとして実行します。 この場合、「dir /od /b %LOGPATH%\AAA*.txt」コマンドの実行結果がfor のループで処理されます。 dir のオプション「/b」はファイル名だけを表示、「/od」はファイルの更新時刻順に並べる、という意味なので、このfor文では「%LOGPATH%\AAA*.txt」に該当するファイルを一番古いのから新しくなる方向に順番に do 以下を処理します。 do 以下では、set SRC=%%F として、for で処理対象のファイルを 環境変数 SRC に設定しています。上述の順番で処理しますので、結果としてこのforが終わった時点では、ループの一番最後すなわち一番新しいファイルのファイル名が 環境変数 SRC に設定された状態になります。 環境変数SRCの設定内容: AAA*.txt の中で一番新しいファイルのファイル名 環境変数DSTの設定内容: AAABKK.txt ですので > copy /y %LOGPATH%\%SRC% %LOGPATH%\%DST% で、一番新しいファイルが AAABKK.txt にコピーされます。 と、ここまで書いてちょっと気づいたのですが、AAABKK.txt も AAA*.txt に該当するので、このままだとAAABKK.txt 自体がバックアップ処理対象になってしまいますね。 AAABKK.TXTが最新ということは、バックアップ対象のファイルが新たに作られていないということですので、 環境変数SRCの内容が AAABKK.TXT でない時だけコピーすればいいということで、コピー部分は --- if not %SRC% == %DST% copy /y %LOGPATH%\%SRC% %LOGPATH%\%DST% --- としておけば、無駄なコピーをしなくなる分、効率がちょっと良いです。

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

質問者さんの書いたコマンドだと、FORFILESの引数が 「cmd /c COPY /y C:\test D:\test\AAABKK.txt」 になってますから、 マッチしたファイルに関係なくこのコマンドを実行してしまいますね。 コピー元はFORFILESでマッチしたファイルを指定するように、 ---ここから--- FORFILES /P %LOGPATH% /M AAA*.txt /C "cmd /c COPY /y @path D:\test\AAABKK.txt" /D 0 ---ここまで--- とするべきでしょう。 あるいは、かならずちゃんと毎日実行するのならいいのですが、 FORFILESで /D 0 (更新日時が実行日同じ日のファイルを対象)にすると、 タイミング的に処理対象のファイルが無い可能性が出てきますので、 「最新のファイル」を対象にするような処理にした方が良いでしょう。 こんな感じでどうですか。 ---ここから--- @echo off set LOGPATH=C:\test set DST=AAABKK.txt for /F "usebackq" %%F in ( `dir /od /b %LOGPATH%\AAA*.txt` ) do set SRC=%%F copy /y %LOGPATH%\%SRC% %LOGPATH%\%DST% ---ここまで---

dfafadfdaf
質問者

補足

ご回答ありがとうございます。 追加で質問させてください。 (1)@echo off (2)set LOGPATH=C:\test (3)set DST=AAABKK.txt (4)for /F "usebackq" %%F in ( `dir /od /b %LOGPATH%\AAA*.txt` ) do set SRC=%%F (5)copy /y %LOGPATH%\%SRC% %LOGPATH%\%DST% 上記のコードでわからないところがあります。 (4)usebackq?? (5)SRC?? などの用語がわかりません。 どういう役割をしてるのかご教示願えませんか。 勉強不足で申し訳ないです・・。

関連するQ&A