簡體   English   中英

Windows批處理錯誤級別與if

[英]windows batch errorlevel with if

在下面的腳本中,即使errorlevel為0,它也會轉到if條件“ 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 . . .

更改

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%都將由該變量的值替換-同樣的情況也適用於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%% ,其顯示的改變值var 顯示CALL ECHO %%errorlevel%% ,但遺憾的是隨后出現了RESETS錯誤級別。

注意最后的陳述

顯示CALL ECHO %% errorlevel %%`,但可悲的是然后顯示RESETS錯誤級別。

因此,您的錯誤errorlevel現在可以正確顯示,但是可以通過call重置為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` %errorlevel% is *not* the same as 您不必以這種方式嘗試,但可以使用另一個答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM