【问题标题】:Windows copy command return codes?Windows 复制命令返回码?
【发布时间】:2011-11-21 21:55:31
【问题描述】:

我想测试批处理文件中副本的成功/失败,但我找不到任何文档说明如果返回任何错误级别代码。例如

copy x y
if %errorlevel%. equ 1. (
    echo Copy x y failed due to ...
    exit /B
) else (
  if %errorlevel% equ 2. (
      echo Copy x y failed due to ...
      exit /B
   )
... etc ...
)

【问题讨论】:

  • 可以很快发现copy a.txt a.txt会返回一个不等于0的errorlevel,copy a.txt b.txt会返回一个errorlevel为零。但正如其他人指出的那样,xcopy 提供了更多信息。但是,如果您不需要该信息,只需成功/失败,copy 就可以了。

标签: windows batch-file


【解决方案1】:

在这种情况下,我会选择xcopy,因为错误级别已记录在案(请参阅xcopy documentation,解释如下):

Exit code  Description
=========  ===========
    0      Files were copied without error.
    1      No files were found to copy.
    2      The user pressed CTRL+C to terminate xcopy.
    4      Initialization error occurred. There is not
           enough memory or disk space, or you entered
           an invalid drive name or invalid syntax on
           the command line.
    5      Disk write error occurred.

无论如何,xcopy 是一个更强大的解决方案。 copyequivalent documentation 没有记录错误级别。


顺便说一句,您可能需要重新考虑您对%errorlevel% 变量的使用。如果有人明确地做了一些愚蠢的事情,它会产生意想不到的结果,至少在某些版本的 Windows 中:

set errorlevel=22

在这些情况下,将使用实际的变量,而不是获取实际的错误级别。这样做的“正常”方式是(按降序排列,因为errorlevel 是“大于或等于”检查):

if errorlevel 2 (
    echo Copy x y failed due to reason 2
    exit /B

)
if errorlevel 1 (
    echo Copy x y failed due to reason 1
    exit /B
)

此外,如果您运行的是 Win7 或 Win Server 2008 或更高版本,您应该查看Robocopy,这是现在首选的批量复制解决方案。

【讨论】:

  • 这样检查更容易:for %%e in (5 4 3 2 1) do if errorlevel %%e goto reason-%%e 后跟echo Copy OK
  • @HarryJohnston:XCOPY 不返回负错误级别。标准是:如果执行OK:返回0,如果因为任何错误结束:返回大于0的值。
  • @HarryJohnston:XCOPY 返回负错误级别是不可能,因为可能的范围是从 0 到 255(一个字节)。实际上,任何外部可执行文件都不可能在 Windows/DOS 环境中返回负的错误级别值。唯一能够这样做的内部 cmd.exe 命令是 EXIT /B exitcode,它使用非标准的、未记录的方法来设置 32 位有符号值。但是,如果您向我展示任何有关如何从 Windows/DOS 环境中的可执行程序返回负错误级别(大于一个字节的值)的文档,我会向您道歉。
  • @Aacini:请参阅 ExitProcess (msdn.microsoft.com/en-us/library/windows/desktop/…)。顺便说一句,DOS与它无关;在 Windows 上,XCOPY 是 Win32 应用程序,而不是 DOS 应用程序。
  • 编译下面的Java程序public class testprog{public static void main(String x[]){System.exit(-123);}}然后运行。之后,echo %errorlevel%确实显示 -123。并不是所有这些对于xcopy 都很重要,它被记录为只返回 0 或更大,所以也许应该在其他地方进行讨论:-)
【解决方案2】:

值得指出的是,xcopy 并不总是返回您期望的错误代码。

例如,当尝试使用通配符复制多个文件但没有要复制的文件时,您期望返回错误代码 1(“找不到要复制的文件”),但它实际上返回 0(“文件已复制没有错误”)

C:\Users\wilson>mkdir bla

C:\Users\wilson>mkdir blert

C:\Users\wilson>xcopy bla\* blert\
0 File(s) copied

C:\Users\wilson>echo %ERRORLEVEL%
0

【讨论】:

  • 数理逻辑:sum(0) = 0。并不是说没有相反的论据,但是没有复制是,imo,绝对不是失败条件:零操作列表总是成功(想想LINQ或其他SQL查询,如果结果集是空)。
  • 是的,我知道。从逻辑上讲,返回码为零可能是正确的。但是当您考虑返回代码描述“文件被复制时没有错误”时,我希望这种情况下的返回代码非零。
  • 也许 xcopy 需要第 6 个返回码:5 - 没有错误地复制文件。这会消除任何混乱,对吧?
【解决方案3】:

我相信Copy 只会返回 0 表示成功或 1 表示失败。

XCopy 已记录返回码:

0 = 文件复制没有错误。
1 = 找不到要复制的文件。
2 = 用户按下 CTRL+C 来终止 xcopy。
4 = 发生初始化错误。内存或磁盘空间不足,或者您在命令行中输入了无效的驱动器名称或语法。
5 = 发生磁盘写入错误。

【讨论】:

    【解决方案4】:

    还有一点我想强调一下:xcopyrobocopy 只能复制文件,不能重命名。
    在查看原始情况(copy x y,对我来说似乎是重命名)时,我的印象是 copy 命令仍然是唯一适合此目的的命令。

    【讨论】:

    • 我没有意识到这一点。 copy x y 是任意的,我并不是要暗示仅重命名。我一直在使用带有副本的 0 和 1 返回码,它们工作正常。
    • 实际上你可以用XCOPY重命名文件,我已经用过去的脚本做了很多年了......ECHO F | XCOPY /Y /F "C:\Path\OrigFileName.txt" "C:\Path\NewFileName.txt"
    【解决方案5】:
    Error# Description 
    0 No error 
    1 Not owner 
    2 No such file or directory 
    3 Interrupted system call 
    4 I/O error 
    5 Bad file number 
    6 No more processes 
    7 Not enough core memory 
    8 Permission denied 
    9 Bad address 
    10 File exists 
    11 No such device 
    12 Not a directory 
    13 Is a directory 
    14 File table overflow 
    15 Too many open files 
    16 File too large 
    17 No space left on device 
    18 Directory not empty 
    999 Unmapped error (ABL default) 
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多