質問: batファイルで robocopy を使用し、**ある文字を含んだファイル名を、抽出して他フォルダへコピーしようと考えております。** 空白を含んだファイル名もコピーしたいので、下記のようなコードを書きました。 * コピー元データの保存先:fs_src * 抽出したデータの保存先:fs_bk * 抽出したいファイル名: name `robocopy /s "%fs_src%" "%fs_bk%" "*%name%*.*"` コピー結果が失敗したか成功したかを知りたいので**LOGをtxtファイルで出力しようとしています**が 下記のように書いてもなにも出ませんでした。 robocopy 文の後にLOG文 を書いておりました。 * LOG出力先指定:logdir * LOGファイル名:target * ログ用の日付、時刻、ファイル名設定:ToDay * 抽出したデータの保存先:fs_bk `/LOG:log\%logdir%\%target%_%ToDay%.txt %%~pI %fs_bk% %%~nxI` うまくいけばこのようなLOGテキストファイルができるはずです。 例:2020/03/30 にbatを実行した場合 copylog_20200330104845.txt どなたかご教授いただけると幸いです。
回答: `robocopy`コマンドの表示を`>NUL 2>&1`とかで抑制するとか、バッチ自身を非表示で実行するとかしていない限り、結果が正常でもエラーでも以下のように何かしら表示されますので、そこから対処を考えてみてください。 また特に止めなければバッチが終われば表示は消えてしまうので、確認のためには`robocopy`の直後に一時的に`pause`を入れる等してください。 正常実行時の例: ``` ログ ファイル: C:\Develop\LOG\EXECUTED\COPYLOG_20200401100124.TXT ``` エラー発生時の例: ``` 2020/04/01 09:55:51 エラー 3 (0x00000003) ログ ファイルを開いています C:\Develop\LOG\EXECUTED\COPYLOG_20200401095551.TXT 指定されたパスが見つかりません。 ROBOCOPY :: Windows の堅牢性の高いファイル コピー 開始: 2020年4月1日 9:55:51 コピー元 - C:\Develop\WORKING\ コピー先 - C:\Develop\BACKUP\20200401095551\ ファイル: *robo*.* オプション: /S /DCOPY:DA /COPY:DAT /R:1000000 /W:30 エラー: 無効なパラメーター #5 : "/LOG:LOG\EXECUTED\COPYLOG_20200401095551.TXT" 簡易な使用法 :: ROBOCOPY コピー元 コピー先 /MIR コピー元 :: コピー元ディレクトリ (ドライブ:\パスまたは \\サーバー \共有\パス)。 コピー先 :: コピー先ディレクトリ (ドライブ:\パスまたは \\サーバー \\共有\パス)。 /MIR :: 完全なディレクトリ ツリーをミラー化します。 詳細な使用方法については、ROBOCOPY /? を実行してください。 **** /MIR はファイルをコピーできるだけでなく、削除もできます。 ``` 問題無く実行されたとして、ユーザー権限での実行時はバッチファイルの存在するフォルダまたはショートカットやシェル実行で指定した作業フォルダ/管理者権限での実行時はシステムフォルダ、の下に`log\%logdir%\%target%_%ToDay%.txt`が出来ます。探してみてください。 エラー原因で良くあるのが以下の2つです。 * 出力先パスに指定した途中のフォルダ("LOG"とか"LOG\%logdir%"(を展開したもの))が存在しない * フォルダ名に空白が含まれているが、全体を`"`で囲っていない なおちなみに、質問記事のパス指定方法だと、ログファイル名指定の後ろに付いている`%%~pI %fs_bk% %%~nxI`が意味不明のような気がします。 そしてログファイル名に年月日時分秒を含めているようですが、コピーするファイルが少なくて条件を変えてループ等で複数回動作させている場合、同じ秒の間に複数実行されて上書きされる可能性があるため、`/LOG:`ではなく`/LOG+:`にしておいた方が良いかもしれません。 例えばこんな記述が考えられます。 ``` SET FS_SRC=C:\Develop\WORKING SET NAME=robo SET LOGDIR=EXECUTED SET TARGET=COPYLOG SET TODAY=%DATE:/=%%TIME::=% SET TODAY=%TODAY: =0% SET TODAY=%TODAY:~0,14% SET FS_BK=C:\Develop\BACKUP\%TODAY% MKDIR %FS_BK% ROBOCOPY "%FS_SRC%" "%FS_BK%" "*%NAME%*.*" /S /LOG+:"LOG\%LOGDIR%\%TARGET%_%TODAY%.TXT" ``` 参考記事: robocopyでバックアップした時のログファイルを日付毎に作成する方法(+過去の古いファイルの削除方法も)