Pregunta ERRORLEVEL dentro de IF


Acabo de tropezar con algo raro con %ERRORLEVEL% y quería ver si alguien sabe por qué y si hay una manera de solucionarlo. Esencialmente, parece como si los comandos ejecutados dentro de las declaraciones if no configuraran el %ERRORLEVEL% variable. los ERRORLEVEL (como en IF ERRORLEVEL 1, que es diferente de IF %ERRORLEVEL% EQU 1 ) check parece funcionar todavía bien, así que probablemente pueda evitarlo, pero aún así sería bueno poder imprimir el nivel de error. Para la depuración o lo que sea.

@echo off
Set TESTVAR=1

tasklist | find /I "IsntRunning.exe" > NUL
echo OUTSIDE_IF %ERRORLEVEL%

ThisWillSetErrorLevelTo9009ieNotRecognizedCommand

tasklist | find /I "IsntRunning.exe" > NUL
echo OUTSIDE_IF %ERRORLEVEL%

ThisWillSetErrorLevelTo9009ieNotRecognizedCommand

IF %TESTVAR% EQU 1 (
    Set ERRORLEVEL=
    tasklist | find /I "IsntRunning.exe" > NUL
    echo INSIDE_IF  ERRORLEVEL %ERRORLEVEL%

    IF ERRORLEVEL 1 (
        echo INSIDE_IF2  ERRORLEVEL GREQ 1 %ERRORLEVEL%
    )
    IF ERRORLEVEL 2 (
        echo INSIDE_IF2  ERRORLEVEL GREQ 2 %ERRORLEVEL%
    )
    IF ERRORLEVEL 3 (
        echo INSIDE_IF2  ERRORLEVEL GREQ 3 %ERRORLEVEL%
    )
)

tasklist | find /I "IsntRunning.exe" > NUL
echo OUTSIDE_IF ERRORLEVEL %ERRORLEVEL%

@echo on

Poner eso en un archivo por lotes y ejecutarlo produce este resultado:

C: \ Users \ username \ Documents \ work> test.bat
      OUTSIDE_IF 1
      'ThisWillSetErrorLevelTo9009ieNotRecognizedCommand' no se reconoce como un comando interno o externo,       programa operable o archivo por lotes.
      OUTSIDE_IF 1
      'ThisWillSetErrorLevelTo9009ieNotRecognizedCommand' no se reconoce como un comando interno o externo,       programa operable o archivo por lotes.
      INSIDE_IF ERRORLEVEL 9009
      INSIDE_IF2 ERRORLEVEL GREQ 1 9009
      OUTSIDE_IF ERRORLEVEL 1

Artículos relevantes:


32
2017-12-06 15:27


origen


Respuestas:


Intenta usar setlocal enabledelayedexpansion al comienzo de su archivo por lotes, y !ERRORLEVEL! dentro de tu IF. Esto parece funcionar para mí:

@echo off
setlocal enabledelayedexpansion
dir nul
echo %ERRORLEVEL%
if .1.==.1. (
  urklbkrlksdj - not a command
  echo %ERRORLEVEL%
  echo !ERRORLEVEL!
)

35
2017-12-06 15:45