Windows复制命令返回码?

Bil*_*ert 27 windows batch-file

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

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 ...
)
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 34

xcopy在这种情况下我会选择,因为记录了错误级别(请参阅xcopy文档,下面的解释):

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.
Run Code Online (Sandbox Code Playgroud)

无论如何,这xcopy是一个更强大的解决方案.该等效文档copy不记录错误水平.


另外,您可能想重新考虑使用%errorlevel% 变量.如果有人明确地做了一些愚蠢的事情,那就会产生令人讨厌的后果(至少在某些版本的Windows中):

set errorlevel=22
Run Code Online (Sandbox Code Playgroud)

在这些情况下,将使用实际变量而不是实际的错误级别.执行此操作的"正常"方式是(按递减顺序,因为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
)
Run Code Online (Sandbox Code Playgroud)

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

  • 检查这种方式更容易:`for %% e in(5 4 3 2 1)如果errorlevel %% e goto reason - %% e`后跟`echo Copy OK` (6认同)
  • 编译以下Java程序`public class testprog {public static void main(String x []){System.exit(-123);}}`然后运行它.之后,`echo%errorlevel%`将_indeed_显示-123.并非所有这些对于`xcopy`来说都很重要,因为它被记录为仅返回0或更高,所以也许应该在其他地方进行讨论:-) (3认同)
  • @HarryJohnston:XCOPY返回负误差水平是不可能的**因为可能的范围是从0到255(一个字节).实际上,任何外部可执行文件都不可能在Windows/DOS环境中返回负的错误级别值.能够执行此操作的唯一内部cmd.exe命令是`EXIT/B exitcode`,它使用非标准的,未记录的方法来设置32位有符号值.但是,如果您向我展示如何从Windows/DOS环境中的可执行程序返回负错误级别(大于一个字节的值)的任何文档,我将向您提供道歉. (2认同)

Wil*_*ers 16

值得指出的是,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
Run Code Online (Sandbox Code Playgroud)

  • 是的我懂。从逻辑上讲,返回码为零可能是正确的。但是,当您考虑返回码描述“文件已复制且没有错误”时,我期望这种情况下返回码为非零。 (2认同)

Han*_*ood 11

我相信Copy只有0表示成功,1表示失败.

XCopy 记录了返回代码:

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