É possível solicitar ao ROBOCOPY que saia com um código de saída que indica sucesso ou falha?
Estou usando o ROBOCOPY como parte das minhas configurações de compilação do TeamCity, e ter que adicionar uma etapa para silenciar o código de saída do ROBOCOPY parece bobagem para mim.
Basicamente, eu adicionei isso:
EXIT /B 0
para o script que está sendo executado.
No entanto, é claro que isso oculta quaisquer problemas reais que o ROBOCOPY retornaria.
Basicamente, eu gostaria de ter códigos de saída 0 para SUCCESS e diferentes de zero para FAILURE, em vez da máscara de bits que ROBOCOPY retorna agora.
Ou, se eu não posso ter isso, existe uma sequência simples de comandos em lote que traduzem a máscara de bits do ROBOCOPY para um valor semelhante?
Respostas:
Conforme aqui , o Robocopy possui os seguintes bits de código de saída que compõem o código de saída:
Apenas adicione instruções if / else que
EXIT /B 0
quando o valor de retorno for 1 ou talvez 0 eEXIT /B 1
caso contrário. Mesmo que os arquivos possam ter sido copiados, há algo errado que precisaria de intervenção manual.fonte
O TechNet sugere este one-liner para converter o código de saída em um código de saída mais tradicional:
Ou isso para ignorar completamente o código de saída (ou seja, não se importe se ele falhou ou teve êxito):
No entanto, os dois comandos acima encerrarão um script após a execução da robocópia. Esse é um problema especialmente para compilações de IC. Se você deseja usar robocopy neste cenário, precisará definir o código de erro manualmente para códigos de saída irrelevantes. Abaixo, todos os códigos de erro abaixo de 8 serão reescritos sem nenhum erro e o script continuará, se possível.
fonte
IF %ERRORLEVEL% LEQ 3 set errorlevel=0
e na próxima linha:if %errorlevel% neq 0 exit /b %errorlevel%
(se o arquivo em lotes consistir em várias operações, não apenas na robocópia), porque os códigos OK são menores que 3. ss64.com/nt/robocopy -exit.htmlERRORLEVEL
com %%%, assim: %% ERRORLEVEL %%. Caso contrário, ele considera o parâmetro de construção do TeamCity.^&
faz? ss64 diz escapes, mas parece-me que não deve ser escapado?Executá-lo a partir de Jenkins precisa de
( )
e/B
. Se você deseja ignorar o nível de erro 1,2,3,4:fonte
A partir desta página você pode adicionar uma seção ao seu arquivo de lote que usa a lista de códigos de erro para a saída dos erros e executar diferentes seções do código:
fonte
Eu uso isso:
fonte
Alguns pôsteres acima perderam a sutileza da máscara de bits. Em particular, o paradroid perdeu esse nível de erro 3, indicando uma cópia completamente bem-sucedida.
Observe que o bit 0x01, se definido, indica que alguns arquivos foram copiados mesmo se houver outras falhas. Portanto, quaisquer níveis de erro numerados ímpares sempre indicam que pelo menos alguns arquivos foram copiados. Observe também que o bit 0x02 simplesmente indica que existem arquivos no destino que não estão presentes na fonte. Isso acontecerá se a opção / E for usada e os arquivos tiverem sido excluídos da fonte desde que uma cópia anterior foi obtida. Isso não deve acontecer se a opção / MIR for usada, pois isso deve excluir os arquivos no destino para espelhar a fonte (mas eu não testei isso).
Portanto, o nível de erro 1 E 3 indica a cópia bem-sucedida de arquivos sem erros. Os níveis de erro 0 E 2 também indicam que o destino está atualizado e que nenhum arquivo foi copiado.
Por quanto vale, criei o seguinte para meu backup simples:
se errorlevel 16 echo Backup falhou - veja o motivo acima e foi feito
if errorlevel 8 echo Nem tudo está bem - o backup está incompleto e foi feito
if errorlevel 4 echo Nem tudo está bem - alguns arquivos foram incompatíveis e foram feitos
se errorlevel 3 echo Backup concluído com sucesso e foi concluído
if errorlevel 2 echo Backup já atualizado - nenhum arquivo copiado e pronto
se o nível de erro 1 eco backup concluído com êxito e for concluído
if errorlevel 0 echo Backup já atualizado - nenhum arquivo copiado e pronto
Eu escolhi não me preocupar com os arquivos 'extras'.
Eu não tenho idéia do que é o erro 'incompatível' porque ainda não aconteceu, mas eu o permiti por precaução.
fonte
Concordo com o convidado John - você realmente deseja indicar apenas um erro se o resultado for realmente 8 ou superior.
para mapear um resultado de robocópia para um resultado 0 (êxito) ou 1 (falha), adequado para uso em um trabalho do SQL Agent, estou usando o seguinte:
fonte
Para o TeamCity, estou usando isso e está funcionando muito bem. Agradecemos a participação de MikeWyatt, DaoCacao e Yan Sklyarenko. Eu só precisava ver um exemplo completo de trabalho para ajudar a visualizar a resposta.
fonte
adicione cmd / c antes para o gitlab ci.
caso contrário, EXIT 0 fecha o pipeline do IC nesse ponto.
fonte
Um exemplo aqui sobre como copiar arquivos concluídos do Visual Studio 2010 ou superior para outra pasta, pois o Visual Studio espera um 0 e não 1 em uma boa cópia.
fonte