¿Es posible pedirle a ROBOCOPY que salga con un código de salida que indica éxito o fracaso?
Estoy usando ROBOCOPY como parte de mis configuraciones de construcción de TeamCity, y tener que agregar un paso para silenciar el código de salida de ROBOCOPY me parece una tontería.
Básicamente, he agregado esto:
EXIT /B 0
al script que se está ejecutando.
Sin embargo, esto, por supuesto, oculta cualquier problema real que ROBOCOPY devolvería.
Básicamente, me gustaría tener códigos de salida de 0 para SUCCESS y no-zero para FAILURE en lugar de la máscara de bits que ROBOCOPY devuelve ahora.
O, si no puedo tener eso, ¿hay una secuencia simple de comandos por lotes que traduciría la máscara de bits de ROBOCOPY a un valor similar?
Respuestas:
Según aquí , Robocopy tiene los siguientes bits de código de salida que forman el código de salida:
Simplemente agregue declaraciones if / else que
EXIT /B 0
cuando el valor de retorno es 1 o tal vez 0, y de loEXIT /B 1
contrario. Incluso si los archivos pudieran haber sido copiados, hay algo mal que necesitaría intervención manual.fuente
TechNet sugiere esta línea para convertir el código de salida en un código de salida más tradicional:
O esto para ignorar el código de salida por completo (es decir, no me importa si falló o tuvo éxito):
Sin embargo, los dos comandos anteriores terminarán un script después de que se haya ejecutado la robocopy. Este es un problema especialmente para las compilaciones de CI. Si desea utilizar robocopy en este escenario, debe configurar el código de error manualmente para los códigos de salida irrelevantes. A continuación, todos los códigos de error inferiores a 8 se reescribirán sin ningún error, y el script continuará si es posible.
fuente
IF %ERRORLEVEL% LEQ 3 set errorlevel=0
y en la siguiente línea:if %errorlevel% neq 0 exit /b %errorlevel%
(si el archivo por lotes consta de varias operaciones, no solo robocopy), porque los códigos OK son menores que 3. ss64.com/nt/robocopy -exit.htmlERRORLEVEL
con el doble %%, así: %% ERRORLEVEL %%. De lo contrario, lo considera un parámetro de compilación de TeamCity.^&
? ss64 dice escapes pero me parece que no se debe escapar?Ejecutarlo desde Jenkins necesita ambos
( )
y/B
. Si desea ignorar el nivel de error 1,2,3,4:fuente
Desde esta página puede agregar una sección a su archivo por lotes que utiliza la lista de códigos de error para generar los errores y ejecutar diferentes secciones de código:
fuente
Yo uso esto:
fuente
Algunos de los carteles anteriores han perdido la sutileza de la máscara de bits. En particular, el paradroid ha pasado por alto que el error de nivel 3 indica una copia completamente exitosa.
Tenga en cuenta que el bit 0x01 si se establece indica que algunos archivos se han copiado incluso si hubo otras fallas. Por lo tanto, cualquier nivel de error impar siempre indica que al menos algunos archivos se han copiado. Tenga en cuenta también que el bit 0x02 simplemente indica que hay archivos en el destino que no están presentes en la fuente. Esto sucederá si se usa el modificador / E y los archivos se han eliminado de la fuente desde que se tomó una copia anterior. No debería suceder si se usa el modificador / MIR porque eso debería eliminar archivos en el destino para reflejar la fuente (pero no lo he probado).
Entonces, tanto el nivel de error 1 como el 3 indican una copia exitosa de archivos sin errores. También los niveles de error 0 y 2 indican que el destino está actualizado y que no se copiaron archivos.
Por lo que vale, se me ocurrió lo siguiente para mi copia de seguridad simple:
si el nivel de error 16 echo Respaldo falló - vea la razón arriba y pase a
si errorlevel 8 echo All is not well - copia de seguridad incompleta y listo
si errorlevel 4 echo All no está bien: algunos archivos no coinciden y se ha completado
si errorlevel 3 echo La copia de seguridad se completó con éxito y se completó
si errorlevel 2 echo La copia de seguridad ya está actualizada: no se copiaron archivos ni se realizó
si errorlevel 1 echo La copia de seguridad se completó con éxito y se completó
si errorlevel 0 echo La copia de seguridad ya está actualizada: no se copiaron los archivos y se realizó
Elegí no preocuparme por los archivos 'extra'.
No tengo idea de cuál es el error 'no coincidente' porque aún no ha sucedido, pero lo permití por si acaso.
fuente
Estoy de acuerdo con Guest John: realmente solo quieres indicar un error si el resultado es en realidad 8 o superior.
así que para asignar un resultado de robocopy a un resultado 0 (éxito) o 1 (error), adecuado para usar en un trabajo de Agente SQL, estoy usando esto:
fuente
Para TeamCity estoy usando esto y está funcionando bastante bien. Gracias a las aportaciones de MikeWyatt, DaoCacao y Yan Sklyarenko. Solo necesitaba ver un ejemplo de trabajo completo para ayudar a visualizar la respuesta.
fuente
agregue cmd / c antes para gitlab ci.
de lo contrario, EXIT 0 cierra la canalización de CI en ese punto.
fuente
Un ejemplo aquí sobre cómo copiar archivos terminados de Visual Studio 2010+ a otra carpeta ya que Visual Studio espera un 0 no 1 en una buena copia.
fuente