navi27
navi27

Reputation: 23

windows batch errorlevel with if

In the below script even if errorlevel is 0, Its going to if condition "if errorlevel 1"

@echo off
if exist servers.txt goto :continue
echo servers.txt file is missing
exit

:continue    
set instance=%username:~2%
setlocal enabledelayedexpansion
for /f "delims=" %%i in (servers.txt) do (
  pushd \\%%i\D$\%instance%\Hyperion\oracle_common 2>nul  
  if not errorlevel 1 (  
    echo %%i
    echo **********************************
    set ORACLE_HOME=!CD!
    echo ORACLE_HOME is !ORACLE_HOME!
    D:
    FOR /D /r D:\%instance%\Hyperion %%a in ("jdk160_*") DO CD %%a
    set JAVA_HOME=!CD!
    echo JAVA_HOME is !JAVA_HOME!
    echo D:\%instance%\Hyperion\oracle_common\oui\bin\setup.exe -jreLoc !JAVA_HOME! -silent -attachHome ORACLE_HOME=!ORACLE_HOME! ORACLE_HOME_NAME="REMOTE_EPM"
    D:\%instance%\Hyperion\oracle_common\oui\bin\setup.exe -jreLoc !JAVA_HOME! -silent -attachHome ORACLE_HOME=!ORACLE_HOME! ORACLE_HOME_NAME=REMOTE_EPM
    echo error code is:%errorlevel%
    if errorlevel 2 (
        echo unable to attach remote server %%i ORACLE_HOME to inventory
        pause
        exit
    )
    cd D:\%instance%\Hyperion\oracle_common\OPatch
    if errorlevel 1 (
        echo Failed to locate OPatch location D:\%instance%\Hyperion\oracle_common\OPatch
        pause
        exit
    )
    echo current: !CD!
    opatch.bat lsinv | find "applied on"
    D:\%instance%\Hyperion\oracle_common\oui\bin\setup.exe -jreLoc !JAVA_HOME! -silent -detachHome ORACLE_HOME=!ORACLE_HOME! ORACLE_HOME_NAME="REMOTE_EPM"
    if errorlevel 1 (
        echo Error: unable to detach remote server %%i ORACLE_HOME from inventory
        pause
        exit
    )
    popd
    pause
  ) else (
    echo ORACLE_HOME is Not found: \\%%~i\D$\%instance%\Hyperion\oracle_common
  )
  pause
)
endlocal

Output is:

vmhodwbrep9.oracleoutsourcing.com
**********************************
ORACLE_HOME is Y:\pwbre7\Hyperion\oracle_common
JAVA_HOME is D:\pwbre7\Hyperion\jdk160_35
D:\pwbre7\Hyperion\oracle_common\oui\bin\setup.exe -jreLoc D:\pwbre7\Hyperion\jdk160_35 -silent -attachHome ORACLE_HOME=Y:\pwbre7\Hyperion\oracle_common ORACLE_HOME_NAME="REMOTE_EP
M"
error code is:0
unable to attach remote server vmhodwbrep9.oracleoutsourcing.com ORACLE_HOME to inventory
Press any key to continue . . .

Upvotes: 0

Views: 4432

Answers (2)

Magoo
Magoo

Reputation: 80213

change

echo error code is:%errorlevel%
if errorlevel 2 (

to

call echo error code is:%%errorlevel%%
if errorlevel 2 (

OR, preferably since you have invoked delayedexpansion,

echo error code is:!errorlevel!
if errorlevel 2 (

With your current code, the entirity from

if not errorlevel 1 (

to the single ) before the endlocal line is one block statement.

Within a block statement (a parenthesised series of statements), the entire block is parsed and then executed. Any %var% within the block will be replaced by that variable's value at the time the block is parsed - before the block is executed - the same thing applies to a FOR ... DO (block).

Hence, since the block starts with

if not errorlevel 1 (

then %errorlevel% will be replaced by the value of errorlevel at the time the if is encountered, that is 0, so your echo will be replaced by echo error code is:0

Two common ways to overcome this are 1) to use setlocal enabledelayedexpansion and use !var! in place of %var% to access the changed value of var or 2) to call a subroutine to perform further processing using the changed values.

Note therefore the use of CALL ECHO %%var%% which displays the changed value of var. CALL ECHO %%errorlevel%% displays, but sadly then RESETS errorlevel.

note that last statement

CALL ECHO %%errorlevel%%` displays, but sadly then RESETS errorlevel.

So your errorlevel would now be displayed correctly, but would be reset to 0 by the call.

Upvotes: 2

David Hoelzer
David Hoelzer

Reputation: 16379

Unless command extensions are enabled, you cannot easily access ERRORLEVEL in an echo statement.

Also keep in mind that you must check your conditions in reverse because...:

 IF ERRORLEVEL 1 ....

checks to see if ERRORLEVEL is greater than or equal to one. So, a series of tests would be:

 IF ERRORLEVEL 5 ....
 IF ERRORLEVEL 4 ....
 IF ERRORLEVEL 3 ....
 IF ERRORLEVEL 2 ....
 IF ERRORLEVEL 1 ....

Finally, recognize that in an IF statement, %errorlevel% is *not* the same asERRORLEVEL`. You don't try it this way, but another answer does.

Upvotes: 2

Related Questions