[英]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.