0

次のバッチ ファイルを検討してください。

@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

2 番目の FOR ステートメントで、ERRORLEVEL = 0 の場合、次の FOR アイテムに移動する代わりに、ファイルの残りの部分が実行されます。これを意図したとおりに機能させるにはどうすればよいですか?

ありがとう!

4

1 に答える 1

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
于 2012-08-13T12:12:56.990 に答える