我在批处理文件中使用 robocopy 来复制文件夹。我希望标准输出转到一个日志文件,并将错误消息转到另一个日志文件。
我尝试了以下内容:
robocopy Z\BR "C\WIN" /E /LOG+:STANDART.LOG 2 /LOG+:ERROR.LOG
但“如果没有错误”(不确定OP意味着什么),标准输出将转到ERROR.LOG。 任何人都可以帮助我吗?
答案 0 :(得分:4)
同时拥有标准日志和错误日志的问题的解决方案是创建一个TEMPORARY日志,然后决定如何处理它。
我还发现了ROBOCOPY和错误报告方面的一些问题。
1)如果使用内置/log:file
或/log+:file
创建日志文件,则并非所有错误都会在日志中结束。
2)此外,并非所有错误都会报告给ERRORLEVEL
3)最后,成功的副本可能会被报告为ERRORLEVEL 1
。
为了解决这个问题,我使用3种方法来捕获所有错误。首先,我将STDOUT重定向到临时日志文件,然后检查该日志文件中的两个位置是否为“ERROR”,第三个也检查ERRORLEVEL。
问题的一部分是ROBOCOPY在其日志文件的末尾添加了两个 EOF 字符。通常这不是问题,除非尝试连接像我这样的文件。当您正常连接文件时,最后一个字符(EOF字符)将被覆盖。但是如果有两个EOF字符,那么附加到该文件的所有内容都会在此之后,因此当您以正常方式访问该文件时,您看不到任何附加数据。
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%
答案 1 :(得分:2)
基于一些测试,似乎ROBOCOPY不使用stderr。它似乎将错误消息与所有其他输出一起发送到stdout。所以我认为你不能做你想做的事。
我通过故意发布有错误的ROBOCOPY并将stderr重定向到nul来测试。错误仍然出现在屏幕上。
ROBOCOPY Let's generate an error :) 2>nul