La documentación de Microsoft establece que los xcopycódigos de salida son
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.
Estoy funcionando con un sistema de 64 bits de Windows 10 (local española), y he intentado todo lo que podía pensar en conseguir una errorlevel 1de xcopy, pero no he podido. Y por todo lo que quiero decir, lo único que no probé fue /Ncon nombres largos de archivo en una fuente donde los nombres cortos no están habilitados (en mi entorno no puedo probarlo). Sospechosos habituales comodines coincidentes no, nombres de archivo no presentes, carpetas vacías, /D, /EXCLUDE, /A, /M, /U, ... fueron probados.
Pensé que debería ser fácil (¿no se encontraron archivos ?, fácil), pero estaba equivocado, no lo era, así que lo depuré xcopy.exey esto es lo que vi:
xcopyinternamente utiliza un método llamadoDisplayMessageAndExit(messageID, WSTRING, exitCode)para, bueno, mostrar un mensaje y salir. También utiliza variasexitllamadas para abandonar el programa en algunos casos (ej. Ctrl-C)No he encontrado ninguna
exitllamada que pueda usar un valor de1De la lista de llamadas realizadas a
DisplayMessageAndExit, ninguno de ellos pasa / recibe un valor de1como código de salida.De la lista de llamadas realizadas,
DisplayMessageAndExitsolo una de ellas usa el MessageID0x5622(en mi instalación los recursos asociados están enC:\Windows\System32\es-ES\ulib.dll.muiél, depende de la configuración regional), es decirNo se encuentra el archivo: %1(File not found - %1), y el código de salida utilizado en la llamada es4
Quizás haya una manera xcopyde generar el 1código de salida, pero no sé cómo.
Entonces la pregunta es: ¿hay alguna forma de obtener el errorlevel 1código de salida xcopy? ¿Qué me estoy perdiendo?

/dy no hay archivos más nuevos./dno lo haceCOPYIT.BATen el enlace proporcionado para realizarxcopyoperaciones y utilizar elifcomando por lotes para procesar el código de salida si se produce un error . El lote no se preocupaerrorlevel 1en absoluto y procesa solo los niveles de error 4, 2 y 0 (¿ no es un error, es una característica ?):lowmemorysolo necesitas unagoto, no unaif errorlevel 0que en este escenario siempre sea cierta ¿Por qué usar unif? Es solo mi opinión, pero para mí parece un fracaso (incorrecto), como en laswitchdeclaración C. Por supuesto, no sé "por qué" y podría estar equivocado (de nuevo). En cualquier caso, sí, su punto crea una omisión sospechosa en su código.Respuestas:
Lo único en lo que puedo pensar es en algún tipo de condición de carrera que entre xcopy reuniendo la lista de archivos que copiará y realmente haciendo la copia, algún otro proceso elimina o mueve los archivos.
Si puede obtener un error 1 si solo faltan ALGUNOS de los archivos de origen, entonces podría hacerlo a propósito. La única forma en que puedo pensar en hacer esto a propósito es tener 2 o más procesos separados ejecutándose, uno xcopy y un comando eliminar o mover, todos operando en los mismos archivos fuente. Necesitará una fuente con muchos archivos en ellos para dar tiempo a los procesos de la competencia para adelantarse entre sí.
Omitir el modificador / C puede significar que si es el primer archivo que xcopy intenta y falla, se dará por vencido de inmediato sin copiar ningún archivo, satisfaciendo así la condición de NO archivos copiados.
fuente
xcopyprograma justo antes de la operación de copia de archivos y cuando se llegó, eliminé el archivo para copiar. Al reanudar elxcopyejecutable obtengo el código de error 4.