Batch file 批处理文件中robocopy的标准输出和错误输出

Batch file 批处理文件中robocopy的标准输出和错误输出,batch-file,robocopy,Batch File,Robocopy,我在批处理文件中使用robocopy复制文件夹。我希望标准输出转到一个日志文件,错误消息转到另一个日志文件 我尝试了以下方法: robocopy Z\BR "C\WIN" /E /LOG+:STANDART.LOG 2 /LOG+:ERROR.LOG 但是“如果没有错误”(不确定OP的意思),标准输出将进入ERROR.LOG。 有人能帮我吗?根据一些测试,ROBOCOPY似乎没有使用stderr。错误消息似乎与所有其他输出一起发送到标准输出。所以我认为你不能做你想做的事 我通过故意发布

我在批处理文件中使用robocopy复制文件夹。我希望标准输出转到一个日志文件,错误消息转到另一个日志文件

我尝试了以下方法:

robocopy Z\BR  "C\WIN"  /E /LOG+:STANDART.LOG  2 /LOG+:ERROR.LOG 
但是“如果没有错误”(不确定OP的意思),标准输出将进入ERROR.LOG。
有人能帮我吗?

根据一些测试,ROBOCOPY似乎没有使用stderr。错误消息似乎与所有其他输出一起发送到标准输出。所以我认为你不能做你想做的事

我通过故意发布带有错误的ROBOCOPY并将stderr重定向到nul来进行测试。错误仍然出现在屏幕上

ROBOCOPY Let's generate an error :) 2>nul

同时拥有标准日志和错误日志的问题的解决方案是创建一个临时日志,然后决定如何处理它

我还发现了ROBOCOPY和错误报告方面的一些问题

1) 如果使用内置的
/log:file
/log+:file
创建日志文件,则并非所有错误都会出现在日志中。
2) 此外,并非所有错误都报告给
ERRORLEVEL

3) 最后,成功复制可能会报告为
错误级别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%
setlocal
设定源=
设定目标=
设置文件=*.*或另一个文件YetThridFile
设置选项=
设置STDLog=STANDART.LOG
设置ErrLog=ERROR.LOG
设置TMPLog=TMP.LOG
出错=
::如果nessicary创建0字节日志文件
如果不存在%ErrLog%copy num%ErrLog%
如果不存在%STDLog%复制nul%STDLog%
::在临时日志文件中创建一个标题,以使每个条目更加可见
回声。>%TMPLog%
回声==================================================================================================>>>%TMPLog%
回声==================================================================================================>>>%TMPLog%
回声。>>%TMPLog%
回显开始:%date:~-4%/%date:~4,5%%time%>>%TMPLog%
::记录如何调用ROBOCOPY
echo机器人复制%source%%dest%%files%%options%%>>%TMPLog%
::调用ROBOCOPY并将STDOUT重定向到%TMPLog%
机器人复制%source%%dest%%files%%options%%>>%TMPLog%
::根据错误的不同,它可能位于第一个或第三个令牌中。
::所以我们需要检查两者。
对于/f“令牌=1,3”%%x in(%TMPLog%)do(
如果“%%x”==“错误”设置错误=TRUE
如果“%%y”==“ERROR”设置err=TRUE
)
::错误也可以通过ERRORLEVEL报告
::0=无错误,跳过所有文件(因为两个目录中的文件相同)
::1=无错误,部分或全部文件已复制。

::2=目标目录包含源目录不包含的额外文件。 设置错误=%errorlevel% 如果%errorlevel%gtr 2设置错误=真 如果“%err%”=TRUE( REM但是我们得到了错误,将临时日志复制到错误日志中。 REM将这两个文件都复制为ASCII。否则您会有麻烦。(这让我非常头疼。) REM命令声明两个源文件为ASCII,目标文件为ASCII 复制/a%ErrLog%+/a%TMPLog%=/a%ErrLog% )否则( REM如果没有错误,请将临时日志复制到标准日志。 REM将这两个文件都复制为ASCII。否则您会有麻烦。(这让我非常头疼。) 复制/a%STDLog%+/a%TMPLog%=/a%STDLog% ) ::删除临时日志文件 删除%TMPLog% ::将errorlevel设置为ROBOCOPY的errorlevel并重置所有变量 结束本地和退出/b%错误%
但是当我尝试时,ERROR.LOG是空的,并且STANDART.LOGOdd中的错误是apear。所有输出是否都在STANDART.LOG中结束?可能是,如果您真的想要两个日志,那么您必须自己解析输出,并将“direct traffick”转换为正确的文件。@zipi-我相信这对您来说是一个完整的答案。解决方案是创建一个临时日志,然后决定如何处理它。如果Microsoft记录ROBOCOPY使用ERRORLEVEL,如果ROBOCOPY以一致的方式处理错误::2=目标目录包含额外的文件源不存在我不明白为什么错误级别2是错误??我想将文件复制到目标文件夹,如果其中一个文件发生更改,请替换它,但目标文件夹中可能有一个文件在源文件夹中不存在?!