Подтвердить что ты не робот

Коды возврата команды копирования 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 ...
)
4b9b3361

Ответ 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 по-прежнему является единственной подходящей для этой цели.