在 Windows 10 中,有可能从“xcopy”获取“错误级别 1”吗?

在 Windows 10 中,有可能从“xcopy”获取“错误级别 1”吗?

微软文档指出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.

我正在运行 Windows 10 64 位系统(西班牙语区域设置),我尝试了所有我能想到的方法来获取errorlevel 1xcopy但还是没能成功。一切我的意思是,我唯一没有测试的是/N源中未启用短名称的长文件名(在我的环境中我无法测试它)。常见的可疑情况包括不匹配的通配符、不存在的文件名、空文件夹、、、、、、……都/D进行了测试。/EXCLUDE/A/M/U

我认为这应该很容易(找不到文件?很容易),但我错了,事实并非如此,所以我进行了调试,xcopy.exe这就是我所看到的:

  • xcopy内部使用一个方法DisplayMessageAndExit(messageID, WSTRING, exitCode)调用来显示一条消息并退出。exit在某些情况下,它还会使用多个调用来退出程序(例如Ctrl-C

  • 我还没有找到任何exit可以使用值的调用1

  • 从对 进行的调用列表中DisplayMessageAndExit,没有一个调用传递/接收 的值1作为退出代码。

  • 从对 进行的调用列表中,DisplayMessageAndExit只有其中一个使用 MessageID 0x5622(在我的安装中,关联的资源位于 中C:\Windows\System32\es-ES\ulib.dll.mui,它取决于语言环境),即No se encuentra el archivo: %1File not found - %1),并且调用中使用的退出代码是4

也许有一种方法xcopy可以生成1退出代码,但我不知道如何做。

所以问题是:有没有办法errorlevel 1从中获取退出代码xcopy?我错过了什么?

答案1

对的,这是可能的。

rem With exiting batch program with errorlevel 1

@echo off

xcopy "file" . /y /d | find /i "0 File(s) copied"
echo %ErrorLevel%
if errorlevel 0 (
   echo File is not copied, errorlevel is %errorlevel%
   exit /b 1
)

rem Or without exit and with preserving the flow of a batch program

@echo off

xcopy "file" . /y /d | find /i "0 File(s) copied"
echo %ErrorLevel%
if errorlevel 0 (
   echo File is not copied, errorlevel is %errorlevel%
   (CALL)
)

答案2

我唯一能想到的就是某种竞争条件,在 xcopy 收集将复制的文件列表和实际执行复制之间,其他一些进程删除或移动了这些文件。

如果只有部分源文件丢失,您就会收到错误 1,那么它可能故意这样做。我能想到的唯一故意这样做的方法是运行 2 个或更多单独的进程,一个 xcopy 和一个删除或移动命令,所有进程都对相同的源文件进行操作。您需要一个包含大量文件的源,以便让竞争进程有时间超越对方。

  1. 对包含大量文件的文件夹启动移动、删除或 robocopy /mov 命令。
  2. 在另一个窗口中,在第一个命令完成之前启动 xcopy 命令

省略 /C 开关可能意味着如果它是 xcopy 尝试并失败的第一个文件,它将立即放弃而不复制任何文件,从而满足没有复制文件的条件。

相关内容