Eu tenho um arquivo em lotes que é um invólucro em torno de um instalador. Este arquivo em lote verifica o nível de erro retornado pelo instalador e é impresso de acordo.
Percebi que, se eu executar set ERRORLEVEL=0
em um prompt de comando antes de iniciar o arquivo em lotes (na mesma janela / ambiente de comando), o instalador nunca mexe com o nível de erro e meu script em lote sempre retorna passado. Eu diria que %ERRORLEVEL%
é uma variável definida pelo Windows e é usada especificamente para imprimir erros de programas e scripts e que o uso da variável em um arquivo em lotes ou qualquer outra coisa seria "por sua conta e risco", pois poderia ser alterado a qualquer momento. outro processo.
Pelo que parece, quando defino o nível de erro no ambiente fornecido, ele termina de alguma forma o uso do nível de erro como detentor do código de saída. Alguém sabe por que isso é? Para mim, é apenas um comportamento estranho e inesperado. Qualquer informação sobre o assunto seria muito apreciada!
fonte
&&
ou||
.Respostas:
Você está redefinindo a variável do sistema para uma variável regular. Quando você faz isso, o sistema não o utilizará até que a sessão de comando seja fechada.
A melhor maneira seria usar
em outro arquivo em lotes e chame-o a partir do seu script principal. Onde o número 0 é o que você deseja
errorlevel
. Ou use um comando que redefinaerrorlevel
para você, como eco, findstr etc.Por exemplo, os seguintes comandos seriam todos definidos
ERRORLEVEL
como 0 no seu arquivo em lotes:fonte
set "errorlevel="
errorlevel
variável tiver sido definida "manualmente" pelo usuário / lote"set errorlevel=0"
, aerrorlevel
variável não refletirá mais o código de saída, mas você ainda poderá acessar o código de saída comif errorlevel do something
.cmd /c exit 42
parece ser a melhor resposta para isso. (2) Como dbenham aponta , você não precisa/b
das aspas.Você nunca deve atribuir seu próprio valor a variáveis dinâmicas do sistema, como ERRORLEVEL, CAMINHO, CD, DATA, HORA, etc. Isso evita que o código veja o valor dinâmico. Você pode restaurar o valor dinâmico, simplesmente indefinindo o valor definido pelo usuário. Por exemplo:
Se você quiser forçar o errorlevel a 0, então você pode usar esta sintaxe totalmente não-intuitivo, mas muito eficaz:
(call )
. O espaço após a chamada é crítico. Se você deseja definir o nível de erro como 1, pode usar(call)
. É fundamental que não haja espaço após a chamada.Um método mais intuitivo, mas menos conveniente para definir o nível de erro é usar uma sub-rotina dedicada em um arquivo em lotes:
Ou, se na linha de comando, você poderia usar
fonte
Eu pessoalmente uso isso:
cd .
Funciona mesmo em shell unix.
fonte
type nul>nul
porque o Process Monitor mostraQueryDirectory
chamadas nocd .
PS:cd .
tem outro bom efeito colateral no shell unix. Ele restaura o diretório de trabalho recriado no terminal se ele tiver sido aberto antes da exclusão.Aqui estão algumas outras maneiras de redefinir o
ErrorLevel
estado, que até funcionam no MS-DOS (pelo menos para a versão 6.22):Os seguintes métodos funcionam apenas no MS-DOS:
Por uma questão de integridade, isso define o
ErrorLevel
estado como1
válido para Windows e MS-DOS:fonte
Esta é a única coisa que eu achei que funciona.
Necessário em um script que usa script de terceiros que detecta ERRORLEVEL, mas não está redefinindo o nível de erro por si próprio.
fonte
Também funcionarão: (Define o nível de erro como 1)
Método 1
Método 2
Você também pode usar isso para definir o nível de erro 1-26:
fonte