La documentación de Microsoft establece que los xcopy
có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 1
de xcopy
, pero no he podido. Y por todo lo que quiero decir, lo único que no probé fue /N
con 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.exe
y esto es lo que vi:
xcopy
internamente utiliza un método llamadoDisplayMessageAndExit(messageID, WSTRING, exitCode)
para, bueno, mostrar un mensaje y salir. También utiliza variasexit
llamadas para abandonar el programa en algunos casos (ej. Ctrl-C)No he encontrado ninguna
exit
llamada que pueda usar un valor de1
De la lista de llamadas realizadas a
DisplayMessageAndExit
, ninguno de ellos pasa / recibe un valor de1
como código de salida.De la lista de llamadas realizadas,
DisplayMessageAndExit
solo 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 xcopy
de generar el 1
código de salida, pero no sé cómo.
Entonces la pregunta es: ¿hay alguna forma de obtener el errorlevel 1
código de salida xcopy
? ¿Qué me estoy perdiendo?
/d
no lo hace
COPYIT.BAT
en 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 1
en absoluto y procesa solo los niveles de error 4, 2 y 0 (¿ no es un error, es una característica ?)
:lowmemory
solo necesitas una goto
, no una if errorlevel 0
que 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 switch
declaració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.
/d
y no hay archivos más nuevos.