結論
- 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
に置き換えるといいのではないでしょうか。