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?
/dno lo hace
COPYIT.BATen el enlace proporcionado para realizar xcopy operaciones y utilizar el if comando por lotes para procesar el código de salida si se produce un error . El lote no se preocupa errorlevel 1en absoluto y procesa solo los niveles de error 4, 2 y 0 (¿ no es un error, es una característica ?)
:lowmemorysolo necesitas una goto, no una if errorlevel 0que en este escenario siempre sea cierta ¿Por qué usar un if? Es solo mi opinión, pero para mí parece un fracaso (incorrecto), como en la switchdeclaració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.
/dy no hay archivos más nuevos.