Коды возврата команды копирования Windows?
Я хотел бы проверить на успех/неудачу копии в пакетном файле, но я не могу найти документацию о том, что, если возвращаются коды ошибок. Например
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 ...
)
Ответы
Ответ 1
В этом случае я бы выбрал 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.
В любом случае, xcopy
является гораздо более мощным решением. эквивалентная документация для copy
не документирует уровни ошибок.
Кроме того, вы можете переосмыслить использование переменной %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, который сейчас является предпочтительным решением для массового копирования.
Ответ 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
Ответ 3
Я считаю, что Copy
возвращает 0 только для успеха или 1 для отказа.
XCopy
имеет зарегистрированные коды возврата:
0 = Файлы были скопированы без ошибок.
1 = Файлы не найдены для копирования.
2 = Пользователь нажал CTRL + C, чтобы завершить xcopy.
4 = Произошла ошибка инициализации. Недостаточно памяти или места на диске, или вы ввели недопустимое имя диска или недопустимый синтаксис в командной строке.
5 = Ошибка записи на диск.
Ответ 4
Также я хотел бы подчеркнуть: xcopy
а также robocopy
могут копировать только файлы, но они не могут их переименовать.
Если посмотреть на исходную ситуацию (copy x y
, которая выглядит как переименование для меня), у меня создается впечатление, что команда copy
по-прежнему является единственной подходящей для этой цели.