次のバッチファイルを使用してrobocopyコマンドを実行しています。
@ECHO OFF
for /f %%a in ('wmic os get LocalDateTime ^| findstr ^[0-9]') do (set ts=%%a)
robocopy [source] [target] /log+:D:\logs\log_%ts:~0,8%.log /e /xo /w:10 /r:1000 /z /NP
robocopy [source] [target] /log+:D:\logs\log_%ts:~0,8%.log /e /xo /w:10 /r:1000 /z /NP
これは、スキップ/失敗したファイルの名前をログに記録しなかったことを除いて、探していたすべての詳細をログに記録するのに役立ちました。スキップされた/失敗したファイルの名前をログに記録して、そのようなファイルを特定するのに役立つスクリプト/ robocopyコマンド/その他の方法はありますか?ネットワークを介した大量のファイル転送に対して、このようなファイルを特定することは非常に困難になります。
私が同様の質問に最も近いのは this ですが、それでも受け入れられた/実用的な答えはありませんでした
EDIT 1:Kamen Minkovのコメントによると、robocopyコマンドに/ v(詳細)を含めました)。意図的にファイル転送に失敗すると、エラーが記録されます(履歴の再試行)が、これによりログファイルの解釈がますます困難になります。/vがなくても同じケースが観察されました。失敗した転送ファイル名を.txtログファイルに一度失敗したものとして記録したいだけです
編集2:JosefZの回答に従って、次のコードを実行しました。
@ECHO OFF
for /f %%a in ('wmic os get LocalDateTime ^| findstr ^[0-9]') do (set ts=%%a)
robocopy [source] [target] /log+:D:\logs\log_%ts:~0,8%.log /e /xo /w:10 /r:0 /z /NP /V
if errorlevel 8 findstr "^[0-9,a-Z]" "D:\logs\log_%ts:~0,8%.log"
これにより、すべてのファイルを転送した後、次のエラーが発生しました(ネットワークケーブルを抜いていくつかのファイルに障害が発生したため、失敗したファイルがありました)。
FINDSTR:D:\ ABC\log\ErrorLog_20151029_1035.logを開くことができません
編集3:上記のエラーは、終了コードのログファイルの名前を誤って指定したために発生しました。正しいコードは次のとおりです(JosefZの回答による):
@ECHO OFF
for /f %%a in ('wmic os get LocalDateTime ^| findstr ^[0-9]') do (set ts=%%a)
robocopy [source] [target] /log+:D:\ABC\log\log_%ts:~0,8%_%ts:~8,4%.log /e /xo /w:10 /r:2 /z /NP /V /TEE
if errorlevel 8 findstr "^[0-9,a-Z]" "D:\ABC\log\log_%ts:~0,8%_%ts:~8,4%.log"
_robocopy /?
_(または robocopy.exe 説明)および ROBOCOPY終了コード に従って、以下を使用します。
/V
_は、スキップされたファイルを示す詳細な出力を生成します。/R:0
_(再試行なし)は、使用中のファイルをスキップすることでコピーを高速化し、ログファイル内の偶発的な特定のエラーの説明を唯一の発生(これにより、その後の調査またはエラーの原因が容易になります)。if errorlevel 8 findstr "^[0-9,a-Z]" "D:\logs\log_%ts:~0,8%.log"
_説明:errorlevel
が7より大きい場合は、コピー操作中に少なくとも1つの障害が発生したことを示します。findstr "^[0-9,a-Z]" ...
_は、たとえば、ログに記録されたエラーのみを表示します2015/10/28 17:27:55 ERROR 32 (0x00000020) Copying File [source]\file.ext
The process cannot access the file because it is being used by another process.
_/w:10
_の場合、_/r:0
_は過剰にあるようです。コード:
_@ECHO OFF
for /f %%a in ('wmic os get LocalDateTime ^| findstr ^[0-9]') do (set ts=%%a)
robocopy [source] [target] /log+:D:\logs\log_%ts:~0,8%.log /e /xo /w:10 /r:0 /z /NP /V
if errorlevel 8 findstr "^[0-9,a-Z]" "D:\logs\log_%ts:~0,8%.log"
_
この記事 によると、/v
オプションを試してみることをお勧めします。
(...)詳細な出力を生成し、スキップされたすべてのファイルを表示します。