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
y no hay archivos más nuevos./d
no lo haceCOPYIT.BAT
en el enlace proporcionado para realizarxcopy
operaciones y utilizar elif
comando por lotes para procesar el código de salida si se produce un error . El lote no se preocupaerrorlevel 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 unagoto
, no unaif errorlevel 0
que en este escenario siempre sea cierta ¿Por qué usar unif
? Es solo mi opinión, pero para mí parece un fracaso (incorrecto), como en laswitch
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.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
xcopy
programa justo antes de la operación de copia de archivos y cuando se llegó, eliminé el archivo para copiar. Al reanudar elxcopy
ejecutable obtengo el código de error 4.