4

Документация Microsoft гласит, что коды выхода 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.

Я использую 64-битную систему Windows 10 (испанский язык) и перепробовал все, что мог, чтобы получить уровень errorlevel 1 от xcopy , но я не смог. И под всем, что я имею в виду, единственное, что я не проверял, это /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: %1 (File not found - %1), и код выхода, использованный в вызове, равен 4

Может быть, есть способ, с помощью которого xcopy может генерировать код выхода 1 , но я не знаю как.

Итак, вопрос: есть ли способ получить код выхода уровня errorlevel 1 из xcopy? Что мне не хватает?

1 ответ1

0

Единственное, о чем я могу думать, это какое-то условие гонки: когда xcopy собирает список файлов, которые он будет копировать, и фактически делает копию, какой-то другой процесс удаляет или перемещает файлы.

Если вы можете получить ошибку 1, если отсутствуют только НЕКОТОРЫЕ из исходных файлов, то это может быть сделано специально. Единственный способ сделать это специально - это запустить 2 или более отдельных процесса, одну команду xcopy и одну команду удаления или перемещения, и все они будут работать с одними и теми же исходными файлами. Вам понадобится источник с большим количеством файлов, чтобы дать конкурирующим процессам время обогнать друг друга.

  1. Запустите команду move, del или robocopy /mov для папки с большим количеством файлов.
  2. в другом окне и задолго до того, как первая команда завершится, запустите команду xcopy

Пропуск ключа /C может означать, что если это первый файл, который xcopy попытается выполнить, то при этом он сразу же сдастся без копирования каких-либо файлов, что удовлетворяет условию копирования файлов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .