¿Es posible obtener un `errorlevel 1` de` xcopy` en Windows 10?

4

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 llamado DisplayMessageAndExit(messageID, WSTRING, exitCode)para, bueno, mostrar un mensaje y salir. También utiliza varias exitllamadas para abandonar el programa en algunos casos (ej. Ctrl-C)

  • No he encontrado ninguna exitllamada que pueda usar un valor de1

  • De la lista de llamadas realizadas a DisplayMessageAndExit, ninguno de ellos pasa / recibe un valor de 1como código de salida.

  • De la lista de llamadas realizadas, DisplayMessageAndExitsolo una de ellas usa el MessageID 0x5622(en mi instalación los recursos asociados están en C:\Windows\System32\es-ES\ulib.dll.muiél, depende de la configuración regional), es decir No 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?

MC ND
fuente
Lo esperaría si usa /dy no hay archivos más nuevos.
AFH
@AFH No. /dno lo hace
DavidPostill
@DavidPostill - Lo siento, no tuve tiempo para verificarlo. Dije que lo esperaría, y creo que debería.
AFH
2
Supongo que en Microsoft lo saben . Hay una muestra 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 ?)
JosefZ
2
@JosefZ, para omitir :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.
MC ND

Respuestas:

0

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í.

  1. Inicie un comando move, del o robocopy / mov en una carpeta con muchos archivos.
  2. en otra ventana, y mucho antes de que termine el primer comando, inicie su comando xcopy

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.

BeowulfNode42
fuente
1
Buen intento, pero no. Para evitar tener que esperar una colisión, puse directamente un punto de interrupción en el xcopyprograma justo antes de la operación de copia de archivos y cuando se llegó, eliminé el archivo para copiar. Al reanudar el xcopyejecutable obtengo el código de error 4.
MC ND