windows批量错误级别,如果

时间:2016-02-02 22:10:56

标签: windows batch-file errorlevel

在下面的脚本中,即使errorlevel为0,如果条件为“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

输出是:

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 . . .

2 个答案:

答案 0 :(得分:1)

变化

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

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

或者,最好是因为您调用了delayedexpansion

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

使用您当前的代码,来自

的完整性

如果不是错误级别1(

endlocal行为block statement之前

到单个

在块语句(a parenthesised series of statements)中,解析整个块并执行然后。块中的任何%var%将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于{{1 }}

因此,由于块以

开头
FOR ... DO (block)

然后if not errorlevel 1 ( 会在遇到%errorlevel%时被errorlevel替换为if,因此0将是echo替换为echo error code is:0

解决此问题的两种常见方法是1)使用setlocal enabledelayedexpansion并使用!var!代替%var%来访问已更改的var或2}值以进行调用一个子程序,用于使用更改的值执行进一步处理。

请注意使用显示CALL ECHO %%var%%更改值的varCALL ECHO %%errorlevel%%显示,但遗憾的是RESETS错误级别。

请注意上一句话

  

显示CALL ECHO %% errorlevel %%`,但遗憾的是RESETS错误级别。

因此,errorlevel现在可以正确显示,但会被0重置为call

答案 1 :(得分:0)

除非启用了命令扩展,否则无法在echo语句中轻松访问ERRORLEVEL

另请注意,您必须反过来检查您的条件,因为......:

 IF ERRORLEVEL 1 ....

检查ERRORLEVEL是否大于或等于1。因此,一系列测试将是:

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

最后,在IF语句中认识到%errorlevel% is *not* the same as ERRORLEVEL`。你不是这样尝试的,但是另一个答案呢。