У меня странная ошибка здесь. У меня есть пакетный скрипт, который я использую для развертывания файла приложения и запуска службы. В этом сценарии я использую какой-то пакет, чтобы проверить, запущен ли сервис, и предлагает пользователю остановить его, если он этого хочет. Эта проверка и подсказка работают, но время от времени, когда я пытаюсь использовать их для остановки службы, ничего не происходит. он просто переходит к следующему шагу без каких-либо ошибок.
Полный пакетный скрипт:
@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