让 ROBOCOPY 返回“正确”的退出代码?

让 ROBOCOPY 返回“正确”的退出代码?

是否可以要求 ROBOCOPY 退出并显示表示成功或失败的退出代码?

我正在使用 ROBOCOPY 作为 TeamCity 构建配置的一部分,并且必须添加一个步骤来使 ROBOCOPY 的退出代码静音,这对我来说似乎很愚蠢。

基本上,我添加了这个:

EXIT /B 0

正在运行的脚本。

然而,这当然掩盖了 ROBOCOPY 可能返回的任何实际问题。

基本上,我希望退出代码为 0 表示成功,非零表示失败,而不是 ROBOCOPY 现在返回的位掩码。

或者,如果我不能这样做,是否有一个简单的批处理命令序列可以将 ROBOCOPY 的位掩码转换为类似的值?

答案1

按照这里,Robocopy 具有以下组成退出代码的退出代码位:

0×10 严重错误。Robocopy 未复制任何文件。这是使用错误或由于对源目录或目标目录的访问权限不足而导致的错误。

0×08 无法复制某些文件或目录(发生复制错误且超出重试限制)。进一步检查这些错误。

0×04 检测到一些不匹配的文件或目录。检查输出日志。可能需要进行日常维护。

0×02 检测到一些额外的文件或目录。检查输出日志。可能需要进行一些整理。

0×01 一个或多个文件复制成功(即有新文件到达)。

0×00 没有发生错误,也没有进行复制。源和目标目录树完全同步。

只需添加 if/else 语句,EXIT /B 0当返回值为 1 或 0 时,EXIT /B 1否则。即使文件可能已被复制,也存在需要手动干预的错误。

答案2

TechNet 建议这一行代码将退出代码转换为更传统的退出代码:

(robocopy c:\dirA c:\dirB *.*) ^& IF %ERRORLEVEL% LEQ 1 exit 0

或者完全忽略退出代码(即不关心它是否失败或成功):

(robocopy c:\dirA c:\dirB *.*) ^& exit 0

但是,上述两个命令都会在 robocopy 执行后终止脚本。这对于 CI 构建来说尤其成问题。如果您想在这种情况下使用 robocopy,则需要手动设置不相关的退出代码的错误代码。下面,所有低于 8 的错误代码都将被重写为完全没有错误,并且脚本将在可能的情况下继续执行。

(robocopy c:\dirA c:\dirB *.*) ^& IF %ERRORLEVEL% LSS 8 SET ERRORLEVEL = 0

答案3

从 Jenkins 运行它需要 和( )/B如果您想忽略错误级别 1,2,3,4:

(robocopy XXX YYY) ^& IF %ERRORLEVEL% LEQ 4 exit /B 0

答案4

上面的一些发帖者忽略了位掩码的微妙之处。特别是 paradroid 忽略了错误级别 3 表示完全成功的复制。

请注意,如果设置了位 0x01,则表示即使存在其他故障,某些文件也已被复制。因此,任何奇数错误级别始终表示至少已复制某些文件。还请注意,位 0x02 仅表示目标中存在源中不存在的文件。如果使用 /E 开关并且自上次复制以来已从源中删除文件,则会发生这种情况。如果使用 /MIR 开关,则不会发生这种情况,因为这应该删除目标中的文件以镜像源(但我尚未测试过这一点)。

因此,错误级别 1 和 3 均表示文件复制成功且无错误。错误级别 0 和 2 也表示目标是最新的且未复制任何文件。

为了它的价值,我想出了以下简单的备份:

if errorlevel 16 echo Backup failed - see reason above & goto done

if errorlevel 8 echo All is not well - backup incomplete & goto done

if errorlevel 4 echo All is not well - some files were mismatched & goto done

if errorlevel 3 echo Backup completed successfully & goto done

if errorlevel 2 echo Backup already up to date - no files copied & goto done

if errorlevel 1 echo Backup completed successfully & goto done

if errorlevel 0 echo Backup already up to date - no files copied & goto done

我选择不去关心那些“额外”的文件。

我不知道“不匹配”错误是什么,因为它还没有发生,但我为了以防万一还是允许了它。

相关内容