微软文档指出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 1
,xcopy
但还是没能成功。一切我的意思是,我唯一没有测试的是/N
源中未启用短名称的长文件名(在我的环境中我无法测试它)。常见的可疑情况包括不匹配的通配符、不存在的文件名、空文件夹、、、、、、……都/D
进行了测试。/EXCLUDE
/A
/M
/U
我认为这应该很容易(找不到文件?很容易),但我错了,事实并非如此,所以我进行了调试,xcopy.exe
这就是我所看到的:
xcopy
内部使用一个方法DisplayMessageAndExit(messageID, WSTRING, exitCode)
调用来显示一条消息并退出。exit
在某些情况下,它还会使用多个调用来退出程序(例如Ctrl-C)我还没有找到任何
exit
可以使用值的调用1
从对 进行的调用列表中
DisplayMessageAndExit
,没有一个调用传递/接收 的值1
作为退出代码。从对 进行的调用列表中,
DisplayMessageAndExit
只有其中一个使用 MessageID0x5622
(在我的安装中,关联的资源位于 中C:\Windows\System32\es-ES\ulib.dll.mui
,它取决于语言环境),即No se encuentra el archivo: %1
(File 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 和一个删除或移动命令,所有进程都对相同的源文件进行操作。您需要一个包含大量文件的源,以便让竞争进程有时间超越对方。
- 对包含大量文件的文件夹启动移动、删除或 robocopy /mov 命令。
- 在另一个窗口中,在第一个命令完成之前启动 xcopy 命令
省略 /C 开关可能意味着如果它是 xcopy 尝试并失败的第一个文件,它将立即放弃而不复制任何文件,从而满足没有复制文件的条件。