Коды возврата команды копирования Windows? - PullRequest
26 голосов
/ 22 ноября 2011

Я хотел бы проверить успешность / неудачу копирования в командном файле, но я не могу найти документацию о том, что если будут возвращены какие-либо коды уровня ошибки. Например

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 ...
)

Ответы [ 4 ]

32 голосов
/ 22 ноября 2011

В этом случае я бы выбрал 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 , который сейчас является предпочтительным решением массового копирования.

16 голосов
/ 24 мая 2012

Также стоит отметить, что 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
11 голосов
/ 22 ноября 2011

Я считаю, Copy возвращает только 0 в случае успеха или 1 в случае неудачи.

XCopy имеет документированные коды возврата:

0 = Файлы были скопированы без ошибок.
1 = Не найдено файлов для копирования.
2 = Пользователь нажал CTRL + C, чтобы завершить xcopy.
4 = Произошла ошибка инициализации. Недостаточно памяти или дискового пространства, или вы ввели неверное имя диска или неверный синтаксис в командной строке.
5 = Произошла ошибка записи на диск.

1 голос
/ 15 декабря 2015

Есть еще один момент, на который я бы хотел обратить внимание: xcopy и robocopy могут только копировать файлы, но не могут их переименовывать.Глядя на исходную ситуацию (copy x y, которая выглядит для меня как переименование), у меня сложилось впечатление, что команда copy все еще является единственной подходящей для этой цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...