バッチ ファイルでrobocopyを使用してフォルダーをコピーします。標準出力を 1 つのログ ファイルに出力し、エラー メッセージを別のログ ファイルに出力したいと考えています。
私は次のことを試しました:
robocopy Z\BR "C\WIN" /E /LOG+:STANDART.LOG 2 /LOG+:ERROR.LOG
しかし、「エラーがない場合」(OPの意味がわからない)、標準出力はERROR.LOGに送られます。誰でも私を助けることができますか?
バッチ ファイルでrobocopyを使用してフォルダーをコピーします。標準出力を 1 つのログ ファイルに出力し、エラー メッセージを別のログ ファイルに出力したいと考えています。
私は次のことを試しました:
robocopy Z\BR "C\WIN" /E /LOG+:STANDART.LOG 2 /LOG+:ERROR.LOG
しかし、「エラーがない場合」(OPの意味がわからない)、標準出力はERROR.LOGに送られます。誰でも私を助けることができますか?
標準ログとエラー ログの両方を持つという問題を解決するには、TEMPORARY ログを作成してから、それをどうするかを決定します。
また、ROBOCOPY とエラーの報告に関するいくつかの問題も発見しました。
/log:file
1) 組み込みのまたはを使用してログ ファイルを作成する場合/log+:file
、すべてのエラーがログに記録されるわけではありません。
2) さらに、すべてのエラーが に報告されるわけではありませんERRORLEVEL
。
3) 最後に、成功したコピーは として報告される場合がありますERRORLEVEL 1
。
これに対抗するために、私は 3 つの方法を使用してすべてのエラーをキャプチャします。最初に STDOUT を一時ログ ファイルにリダイレクトし、次にそのログ ファイルの 2 か所で「ERROR」という単語をチェックし、3 番目に ERRORLEVEL もチェックします。
問題の一部は、ROBOCOPY がログ ファイルの末尾に2 つのEOF文字を配置することです。I am here のようにファイルを連結しようとする場合を除いて、通常は問題ありません。通常、ファイルを連結すると、最後の文字 (EOF 文字) が上書きされます。ただし、EOF 文字が 2 つある場合、ファイルに追加されるすべての文字はその後に続くため、通常の方法でファイルにアクセスすると、追加されたデータは表示されません。
setlocal
set Source=<somedir>
set Dest=<someotherdir>
set Files=*.* or afile anotherfile yetathridfile
set Options=
set STDLog=STANDART.LOG
set ErrLog=ERROR.LOG
set TMPLog=TMP.LOG
set err=
:: If nessicary make 0 byte log files
if not exist %ErrLog% copy nul %ErrLog%
if not exist %STDLog% copy nul %STDLog%
:: Create a header in the temporary log file to make each entry more visable
echo.>%TMPLog%
echo ===============================================================================>> %TMPLog%
echo ===============================================================================>> %TMPLog%
echo.>> %TMPLog%
echo Started : %date:~-4%/%date:~4,5% %time%>> %TMPLog%
:: Record how ROBOCOPY was called
echo ROBOCOPY %source% %dest% %files% %options%>>%TMPLog%
:: Call ROBOCOPY and redirect STDOUT to %TMPLog%
ROBOCOPY %source% %dest% %files% %options%>>%TMPLog%
:: Depending on the error, it may be in the first or third token.
:: So we need to check both.
for /f "tokens=1,3" %%x in (%TMPLog%) do (
if "%%x"=="ERROR" SET err=TRUE
if "%%y"=="ERROR" SET err=TRUE
)
:: The error also MAY be reported via ERRORLEVEL
:: 0 = No error, all files skipped (because they are the same in both dirs)
:: 1 = No error, some or all files copied.
:: 2 = Destination DIR contains extra files the source does not.
set error=%errorlevel%
if %errorlevel% gtr 2 set err=TRUE
if "%err%"=="TRUE" (
REM However we got the error, copy the temp log to the error log.
REM Copy both files as ASCII. Otherwise you'll have trouble. (This caused me BIG headaches.)
REM The command states that the two source files are ASCII and the destination is ASCII
copy /a %ErrLog% + /a %TMPLog%=/a %ErrLog%
) else (
REM If no errors, copy the temp log to the standard log.
REM Copy both files as ASCII. Otherwise you'll have trouble. (This caused me BIG headaches.)
copy /a %STDLog% + /a %TMPLog%=/a %STDLog%
)
:: Delete the temporary log file
del %TMPLog%
:: set the errorlevel to ROBOCOPY's errorlevel and reset all variables
endlocal & exit /b %error%
いくつかのテストに基づくと、ROBOCOPY は stderr を使用していないようです。エラーメッセージは、他のすべての出力とともに stdout に送信されるようです。だから、やりたいことはできないと思います。
ROBOCOPY にエラーを意図的に発行し、stderr を nul にリダイレクトしてテストしました。エラーは引き続き画面に表示されます。
ROBOCOPY Let's generate an error :) 2>nul