Transmitir errorlevel de um lote filho para pai

2

Pai .bat

@echo off
SETLOCAL

set errorlevel=2

start /wait child.bat
echo %errorlevel%

Child.bat

set errorlevel=1
exit %errorlevel%

Saída:

2

Resultado esperado:

1

A resposta fornecida aqui não funciona para mim, também Eu não entendo porque você usaria /b e deixaria o cmd aberto.

    
por taclight 05.07.2016 / 14:30

1 resposta

3

Não Não Não, nunca use SET para atribuir seu próprio valor a ERRORLEVEL.

O problema é que ERRORLEVEL normalmente não é uma variável de ambiente verdadeira. É um valor de pseudo-ambiente dinâmico que reflete o ERRORLEVEL retornado mais recentemente. Mas se você definir sua própria variável de ambiente ERRORLEVEL usando SET, então %ERRORLEVEL% sempre retornará o valor atribuído, não o valor dinâmico desejado.

Esse comportamento é descrito no sistema de ajuda. Se você inserir set /? ou help set na linha de comando, o seguinte será impresso no final:

If Command Extensions are enabled, then there are several dynamic
environment variables that can be expanded but which don't show up in
the list of variables displayed by SET.  These variable values are
computed dynamically each time the value of the variable is expanded.
If the user explicitly defines a variable with one of these names, then
that definition will override the dynamic one described below:

%CD% - expands to the current directory string.

%DATE% - expands to current date using same format as DATE command.

%TIME% - expands to current time using same format as TIME command.

%RANDOM% - expands to a random decimal number between 0 and 32767.

%ERRORLEVEL% - expands to the current ERRORLEVEL value

%CMDEXTVERSION% - expands to the current Command Processor Extensions
    version number.

%CMDCMDLINE% - expands to the original command line that invoked the
    Command Processor.

%HIGHESTNUMANODENUMBER% - expands to the highest NUMA node number
    on this machine.

Se você quiser definir uma variável para conter um código de erro que será usado posteriormente por EXIT ou EXIT / B, use um nome diferente. Eu gosto de usar ERR.

Se você descobrir que alguém definiu erroneamente ERRORLEVEL, você poderá limpá-lo e restaurar a funcionalidade desejada usando set "errorlevel=" .

Se você quiser definir explicitamente ERRORLEVEL como um valor específico sem chamar uma sub-rotina, poderá usar uma das seguintes técnicas:

Defina o valor como 0: (call )

Defina o valor como 1: (call)

Defina o valor para qualquer número (eu usarei 56): cmd /c exit 56

    
por 05.07.2016 / 16:19