LoginSignup
2
2

More than 5 years have passed since last update.

robocopyはlogの出力先のディレクトリを作成してくれない

Last updated at Posted at 2018-02-16

結論

  • robocopyのログ出力先のディレクトリはあらかじめ用意しろ。

経緯

ホストごとの設定ファイルを階層を保持した形でぶち抜きたいという欲求に駆られて、
ホストが1000台弱、これのログ、1ファイルに縦に並べてもまぁいいけど、
ホストごとにファイル分けてサブフォルダに格納したいよね~、

cmd
C:\Users\maru8m\hoge>dir
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は F832-5101 です

 C:\Users\maru8m\hoge のディレクトリ

2018/02/16  22:39    <DIR>          .
2018/02/16  22:39    <DIR>          ..
2018/02/16  22:41                37 a.bat
2018/02/16  22:21    <DIR>          fuga
2018/02/16  22:21    <DIR>          hoge
               1 個のファイル                  37 バイト
               4 個のディレクトリ  245,655,572,480 バイトの空き領域
cmd
C:\Users\maru8m\hoge>robocopy fuga piyo /log:log\log.txt

2018/02/16 22:35:25 エラー 3 (0x00000003) ログ ファイルを開いています C:\Users\maru8m\hoge\log\log.txt
指定されたパスが見つかりません。

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows の堅牢性の高いファイル コピー
-------------------------------------------------------------------------------
(略)

Sigh...

触ってれば気づくことなんですが、robocopy はログの出力先ディレクトリを掘ってくれません。
上の場合ではC:\Users\maru8m\hoge\は存在しますがC:\Users\maru8m\hoge\log\が存在しないために
robocopy は指定されたパスが見つからないとか言います。

対処

α. ログ出力先のパスが存在する環境を前提にする

運用でカバー is 最強。

β. robocopy の手前でパスを切る処理を書く

下記のようになる。

a.bat
@pushd %~dp0
@echo off

call :_init_log_dir
robocopy fuga\ piyo\ /log:log\log.txt
exit /b

:_init_log_dir
if exist %~dp0\log (
    if not exist %~dp0\log\ (
        rem worrywart
        del %~dp0\log
        mkdir %~dp0\log
    )
) else (
    mkdir %~dp0\log
)
exit /b

logというファイルが a.bat と同じ階層にあると削除されてしまうが、
Windows 環境の作業フォルダに拡張子なしのファイルなんてものがあるとは思えないね!
どうしても心配ならrem worrywartの箇所をexit /bとかexit /b 1に置き換えるといいのではないでしょうか。

参考

Windowsバッチまとめ#ファイル存在有無

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2