Остановка службы в пакетном режиме случайным образом ничего не делает - PullRequest
0 голосов
/ 10 мая 2018

У меня странная ошибка здесь. У меня есть пакетный скрипт, который я использую для развертывания файла приложения и запуска службы. В этом сценарии я использую какой-то пакет, чтобы проверить, запущен ли сервис, и предлагает пользователю остановить его, если он этого хочет. Эта проверка и подсказка работают, но время от времени, когда я пытаюсь использовать их для остановки службы, ничего не происходит. он просто переходит к следующему шагу без каких-либо ошибок.

Полный пакетный скрипт:

@echo off

set WILDFLY_DIR=path\to\wildfly\deploy\dir
set JBOSS_DIR=path\to\jboss\deploy\dir 
set EAR_DIR=path\to\ear\file\parent\dir
set SERVICE_WILDFLY=WildflyServiceName
set SERVICE_JBOSS=JBossServiceName
set SERVICE=
set DST=
set SRC=

goto :SEL_SERVER

:SEL_SERVER
set /p SERVER="What Application Server (1: Wildfly; 2: JBoss): "
if %SERVER% == 1 (
   set DST=%WILDFLY_DIR%
   set SERVICE=%SERVICE_WILDFLY%
) else if %SERVER% == 2 (
   set DST=%JBOSS_DIR%
   set SERVICE=%SERVICE_JBOSS%
) else (
   echo Unrecognized Server: %SERVER%
   goto :SEL_SERVER
)
goto :SEL_VERSION

:SEL_VERSION
set /p VERSION="What Version: "
IF /I NOT EXIST %EAR_DIR%\%VERSION% (
   ECHO Unrecognized Version: %VERSION%
   goto :SEL_VERSION
) else (
   set SRC=%EAR_DIR%\%VERSION%
   goto :DO_DEPLOY
)

:DO_DEPLOY
for /F "tokens=3 delims=: " %%H in ('sc query %SERVICE_WILDFLY% ^| findstr "        STATE"') do (
   if /I "%%H" == "RUNNING" (
     set /p STOP_WILDFLY="Wildfly 10 Service is running, stop it now? (Y/N) "
     if /I "%STOP_WILDFLY%" == "Y" (
         net stop %SERVICE_WILDFLY%
     )
   )
)
for /F "tokens=3 delims=: " %%G in ('sc query %SERVICE_JBOSS% ^| findstr "        STATE"') do (
   if /I "%%G" == "RUNNING" (
     set /p STOP_JBOSS="JBoss 6.1 Service is running, stop it now? (Y/N) "
     if /I "%STOP_JBOSS%" == "Y" (
         net stop %SERVICE_JBOSS%
     )
   )
)
echo Deleting existing EAR file...
FORFILES /p %DST% /m MyApplication*.* /c "cmd /c DEL @file"

@echo on
ROBOCOPY %SRC% %DST% MyApplication*.ear
@echo off
goto :START_SERVICE

:START_SERVICE
set /p START="Start Service Now? (Y/N) "

IF /I "%START%" == "Y" (
   net start "%SERVICE%"
)
goto :SEL_SERVER

Конкретная часть, с которой у меня возникла проблема, такова:

for /F "tokens=3 delims=: " %%H in ('sc query %SERVICE_WILDFLY% ^| findstr "        STATE"') do (
   if /I "%%H" == "RUNNING" (
     set /p STOP_WILDFLY="Wildfly 10 Service is running, stop it now? (Y/N) "
     if /I "%STOP_WILDFLY%" == "Y" (
         net stop %SERVICE_WILDFLY%
     )
   )
)
for /F "tokens=3 delims=: " %%G in ('sc query %SERVICE_JBOSS% ^| findstr "        STATE"') do (
   if /I "%%G" == "RUNNING" (
     set /p STOP_JBOSS="JBoss 6.1 Service is running, stop it now? (Y/N) "
     if /I "%STOP_JBOSS%" == "Y" (
         net stop %SERVICE_JBOSS%
     )
   )
)

Это вывод при возникновении проблемы:

What Application Server (1: Wildfly; 2: JBoss): 1
What Version: 2018.1.1
Wildfly 10 Service is running, stop it now? (Y/N) y
Deleting existing EAR file...

The rest removed for brevity....

Когда это работает, вывод будет выглядеть так:

What Application Server (1: Wildfly; 2: JBoss): 1
What Version: 2018.2.1
Wildfly 10 Service is running, stop it now? (Y/N) y
The WildflyServiceName service is stopping...
The WildflyServiceName service was stopped successfully.

Deleting existing EAR file...

the rest removed for brevity....

Я удостоверился, что проверил чувствительность к регистру, и поэтому он должен принимать y или Y. Он случайно пропускает этот шаг и сразу переходит к удалению существующих файлов EAR. Я не смог понять, почему.

Кто-нибудь знает, что может быть причиной этого?

---- EDIT ----

Как указал Майкл Хит в ответе ниже, это проблема с отложенным расширением. Я смог решить проблему, изменив проблемный раздел командного файла следующим образом:

setlocal enabledelayedexpansion
for /F "tokens=3 delims=: " %%H in ('sc query %SERVICE_WILDFLY% ^| findstr "        STATE"') do (
   if /I "%%H" == "RUNNING" (
     set /p STOP_WILDFLY="Wildfly 10 Service is running, stop it now? (Y/N) "
     if /I "!STOP_WILDFLY!" == "Y" (
         net stop %SERVICE_WILDFLY%
     )
   )
)
for /F "tokens=3 delims=: " %%G in ('sc query %SERVICE_JBOSS% ^| findstr "        STATE"') do (
   if /I "%%G" == "RUNNING" (
     set /p STOP_JBOSS="JBoss 6.1 Service is running, stop it now? (Y/N) "
     if /I "!STOP_JBOSS!" == "Y" (
         net stop %SERVICE_JBOSS%
     )
   )
)
endlocal

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Вы не используете setlocal и, следовательно, переменные не являются локально для сценария.

Единственный способ остановить службу - перезапустить ее. скрипт в том же сеансе CMD.

Как прокомментировал Squashman, не использовать " отложенное расширение " проблема. Вы можете увидеть это, если вы запустите скрипт с echo on и может увидеть "%STOP_WILDFLY%" == "Y" оценить до "" == "Y" даже если вы набираете какой-то текст.

Вот пример блока кода в test.cmd. Блок кода CMD анализирует от открытия ( до закрытия ). В строке может существовать более 1 набора (), т.е. if ""=="" (...) else (...), который может охватывать несколько буквенные строки в скрипте.

(
    set /p "reply=prompt [y|n]: "
    echo "%reply%"
)

CMD будет анализировать этот блок кода и интерпретировать как одну строку и %reply% будет оценено, прежде чем вы получите ответ подсказка ввода.

Запустите test.cmd дважды, и вы увидите:

C:\> test.cmd

C:\> (
set /p "reply=prompt [y|n]: "
 echo ""
)
prompt [y|n]: y
""

C:\> test.cmd

C:\> (
set /p "reply=prompt [y|n]: "
 echo "y"
)
prompt [y|n]: y
"y"

Так что теперь вы можете знать, почему это иногда работает, а иногда не работает.

Используйте setlocal в скрипте, если вы не хотите сохранять переменные после выполнения скрипта в том же сеансе CMD. Тип setlocal /? в приглашении CMD для получения дополнительной помощи.

Исследуйте " отложенное расширение ", набрав set /? в приглашении CMD.

0 голосов
/ 11 мая 2018

Вы не ждете остановки службы. Вы должны зацикливаться, пока статус службы не будет остановлен. Смотрите мой предыдущий ответ на очень похожую проблему . Ищите :StoppedWait.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...