在下面的脚本中,即使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 . . .
答案 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%%
更改值的var
。 CALL 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`。你不是这样尝试的,但是另一个答案呢。