2012-08-13 50 views
0

断裂考虑以下批处理文件:CALL在为

@echo off 

set ORACLESERVER=ORAOP09 
set ORACLEDB=OraDb11g_home1 

set ORACLESERVICES.1 = OracleVssWriter%ORACLESERVER% 
set ORACLESERVICES.2 = OracleDBConsole%ORACLESERVER% 
set ORACLESERVICES.3 = Oracle%ORACLEDB%TNSListener 
set ORACLESERVICES.4 = OracleService%ORACLESERVER% 

AT > NUL 
IF ERRORLEVEL 1 (
    echo FATAL: THIS SCRIPT MUST BE RUN AS ADMINISTRATOR! 
    pause 
    exit 
) 

echo Stopping services... 
FOR /F "tokens=2* delims=.=" %%A IN ('SET ORACLESERVICES.') DO sc stop %%B > NUL 
FOR /F "tokens=2* delims=.=" %%A IN ('SET ORACLESERVICES.') DO call:check %%B 

:check 
    sc query %1 | find /I "State" | find /I "STOPPED" 
    IF ERRORLEVEL 1 call:check %1 

echo All services stopped successfully! 
pause 
exit 

在第二FOR语句,当ERRORLEVEL = 0时,文件运行的其余部分,而不是去到下一个FOR项目。我如何按预期做好这项工作?

谢谢!

+0

你需要'转到:eof'在您的子程序(它可以作为一个'return'语句) – wmz 2012-08-13 12:06:39

回答

3

您忘记批处理文件没有控制结构。您必须通过从批处理文件末尾删除或通过exit /b明确终止每个子例程。批处理文件的主体也是如此(以避免犁入第一个子例程的主体)。

此外,你必须在你的check子程序无限期递归,很快就会耗尽cmd的嵌套能力。使用普通的goto

所以:

.................... 
FOR /F "tokens=2* delims=.=" %%A IN ('SET ORACLESERVICES.') DO call:check %%B 

echo All services stopped successfully! 
pause 
exit 
rem If you change your mind and remove the exit above, you'll need this: 
goto :EOF 

:check 
    sc query %1 | find /I "State" | find /I "STOPPED" 
    IF ERRORLEVEL 1 goto check 
    goto :EOF 
    rem Technically you don't need the above line when this subroutine 
    rem is at the end of the batch file, but it's a good idea to put it 
    rem in anyway for clarity and to simplify future modifications