Почему переменная пакетного скрипта остается неизменной внутри цикла FOR?
Нам нужно контролировать демон, как start
, stop
, restart
, status
используя пакетный скрипт где CKI_SYSTEM_STAT
является переменной, динамически изменяемой в зависимости от состояния демона. Здесь мы должны смоделировать это для вашей реализации в соответствии с проблемой. CKI_SYSTEM_STAT
меняется случайным образом, но внутри for
цикл это остается неизменным под stop
этикетка.
По этой причине мы не можем определить, успешно ли демон остановился при выполнении операции остановки. Вот пакетный скрипт для вашего любезного рассмотрения.
rem ebisd.bat
@echo off
if "%OS%" == "Windows_NT" setlocal
set "CKI_OPTION_NAME=%1"
call :init_ebis
call :ebis_case
goto :eof
:init_ebis
rem initialization of varible
if "%CKI_DAEMON_NAME%" == "" set "CKI_DAEMON_NAME=Demon"
goto :eof
rem fetch the process info
:init_meta
rem init flag
SET /A CKI_RANDOM_NUMB=%RANDOM%%%10
echo Random Number %CKI_RANDOM_NUMB%
if %CKI_RANDOM_NUMB% lss 7 (
set "CKI_SYSTEM_STAT=stoped"
) else (
set "CKI_SYSTEM_STAT=runing"
)
goto :eof
:ebis_case
rem label ebis_case
call :init_meta
set "CKI_SWITCH_CASE=false"
for %%i in (start stop status restart) do (
if %%i'==%CKI_OPTION_NAME%' SET "CKI_SWITCH_CASE=true"
)
if "%CKI_SWITCH_CASE%" == "false" call :message
if "%CKI_SWITCH_CASE%" == "true" call :case_%CKI_OPTION_NAME%
goto :eof
:case_start
rem label case_start
call :start
goto :eof
:case_stop
rem label case_stop
call :stop
goto :eof
:case_status
rem label case_status
call :status
goto :eof
:case_restart
rem label case_restart
call :restart
goto :eof
:start
rem label start
if "%CKI_SYSTEM_STAT%" == "runing" (
echo %CKI_DAEMON_NAME% already %CKI_SYSTEM_STAT%
)
if "%CKI_SYSTEM_STAT%" == "stoped" (
echo %CKI_DAEMON_NAME% is starting
)
goto :eof
:status
rem label status
echo %CKI_DAEMON_NAME% is %CKI_SYSTEM_STAT%
goto :eof
rem label stop
:stop
if "%CKI_SYSTEM_STAT%" == "stoped" (
echo %CKI_DAEMON_NAME% %CKI_SYSTEM_STAT%
)
if "%CKI_SYSTEM_STAT%" == "runing" (
echo %CKI_DAEMON_NAME% stoping
for /L %%a in (0,1,5) do (
call :init_meta
call :status
if %%a lss 5 (
if "%CKI_SYSTEM_STAT%" == "runing" (
timeout 3 > NUL
echo Wrong is %CKI_SYSTEM_STAT%
echo .
)
if "%CKI_SYSTEM_STAT%" == "stoped" (
echo stoped
goto :eof
)
)
if %%a equ 10 (
echo unable to stop
)
)
)
goto :eof
:restart
rem label restart
call :stop
call :start
goto :eof
rem label message
:message
echo Usage^: start^|stop^|^status^|restart
goto :eof
:freeze
rem label freeze
@pause
goto :eof
Для вашей реализации я смоделировал это, позвонив status
метка внутри цикла, чтобы увидеть фактическое значение CKI_SYSTEM_STAT
также повторить значение CKI_SYSTEM_STAT
внутри for
петля под stop
этикетка. Но CKI_SYSTEM_STAT
остаются неизменными внутри for
петля. Вот вывод консоли:
c:>batch\ebisd.bat stop
Random Number 8
Demon stoping
Random Number 2
Demon is stoped
Wrong is runing
.
Random Number 4
Demon is stoped
Wrong is runing
.
Random Number 8
Demon is runing
Wrong is runing
.
Random Number 9
Demon is runing
Wrong is runing
.
Random Number 4
Demon is stoped
Wrong is runing
.
Random Number 4
Demon is stoped
Может быть ошибка внутри скрипта или невозможность реализовать область видимости переменной. Было бы замечательно, если бы кто-нибудь помог нам выяснить проблему / ошибку этого скрипта. Ожидается альтернативное решение.