Pergunta

Eu tenho um evento pós-construção que executa alguns comandos para o projeto AC#. O último comando às vezes causava o valor do nível do erro não é igual a zero e, em seguida, a compilação falha.

Quero anexar uma linha de comando extra para sempre definir o valor do ErrorLevel como zero. Qual é a maneira mais conveniente de fazer isso?

Foi útil?

Solução 4

Descobri que "saída 0" parece uma boa maneira de lidar com esse problema.

Exemplo de uso:

Stop líquido UnderDevService /y

saída 0

Se o serviço UnderDevService não for iniciado.

Outras dicas

se você usar exit /b 0 você pode devolver um errorlevel 0 De dentro de um script infantil em lote sem também sair do pai.

Parece fazer o truque:

ver > nul

Nem tudo funciona, e não está claro o porquê. Por exemplo, o seguinte não é:

echo. > nul
cls > nul

Em um evento pré ou pós-construção, se o código de retorno de um executável for maior que zero, e a chamada para o executável não for a última linha do evento pré ou pós-construção, uma maneira rápida de silenciar e evitar desencadeando um cheque para um diferente de zero errorlevel é seguir a linha de falha com uma linha que retorna explicitamente zero:

cmd /c "exit /b 0"

Esta é essencialmente uma combinação genérica das soluções mencionadas anteriormente que funcionarão com mais de apenas A última linha de um evento pré ou pós-construção.

Eu pessoalmente uso isso:

cd .

Funciona mesmo no Unix Shell.

Mas, este pode ser um pouco mais rápido:

type nul>nul

Porque Process Monitor shows QueryDirectory liga cd .

PS: cd . tem outro bom efeito colateral no shell Unix. Ele restaura o diretório de trabalho recriado no terminal, se tiver sido aberto antes da apagação.

eu uso VERIFY ou VERIFY > nul

Se este é um snippet como "Evento pós-construção" etc., você ficará bem anexando:

(...) || ver > nul

No final do último comando.

alternativamente

cmd /c "exit /b 0"

é muito limpo e não-ideal-um leitor que sabe que o Windows Shell saberá o que está acontecendo e qual era a sua intenção.

No entanto, se você estiver em um script em lote, convém usar subrotinas, que são um equivalente leve do "script infantil em lote" da resposta da AKF.

Tenha uma sub -rotina:

:reset_error
exit /b 0

E então apenas

call :reset_error

onde você precisar.

Aqui está um exemplo completo:

@echo off
rem *** main ***

call :raise_error
echo After :raise_error ERRORLEVEL = %ERRORLEVEL%

call :empty
echo After :empty ERRORLEVEL = %ERRORLEVEL%

call :reset_error
echo After :reset_error ERRORLEVEL = %ERRORLEVEL%

:: this is needed at the end of the main body of the script
goto:eof

rem *** subroutines ***

:empty
goto:eof

:raise_error
exit /b 1

:reset_error
exit /b 0

Quais saídas:

After :raise_error ERRORLEVEL = 1
After :empty ERRORLEVEL = 1
After :reset_error ERRORLEVEL = 0

Como você vê - apenas ligar e retornar via Goto: EOF não é suficiente.

Adicionar >nul Após cada comando que provavelmente falhará - isso parece impedir que a construção falhe.

Você ainda pode verificar o resultado do comando examinando %errorlevel%.

Por exemplo:

findstr "foo" c:\temp.txt>nul & if %errorlevel% EQU 0 (echo found it) else (echo didn't find it)

Aqui estão algumas outras maneiras de redefinir o ErrorLevel Estado, que até trabalha no MS-DOS (pelo menos na versão 6.22):

more < nul > nul

rem // The `> nul` part can be omitted in Windows but is needed in MS-DOS to avoid a line-break to be returned:
sort < nul > nul

Os seguintes métodos funcionam apenas no MS-DOS:

command /? > nul

fc nul nul > nul

Por uma questão de completude, isso define o ErrorLevel Estado para 1, válido para Windows e MS-DOS:

< nul find ""

Estou usando isso:

ping localhost -n 1> nulo

Eu sempre usei;

set ERRORLEVEL=0

Eu tenho usado isso para os anos de Donkey.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top