2015-09-08 78 views
0

我有以下批处理脚本,它试图停止一些服务(按顺序),等待并确保两者都已停止,然后启动第一个服务。第一个服务具有第二个服务的依赖关系。这是阻止它们的命令的原因,以及只有其中一个启动的原因。批处理脚本未能将设置变量设置为命令结果

停止命令发出后服务可能需要一段时间才会停止,所以我需要等待并确保它们在尝试再次启动它们之前已经停止。这是我想出了:

set FirstServiceName="SrvcOne" 
set SecondServiceName="SrvcTwo" 

set findStop=find /i "STOPPED" 
set GetFirstServiceState=sc query %FirstServiceName% 
set GetSecondServiceState=sc query %SecondServiceName% 

:sub_StopServices  
set "FirstServiceState=^"^"" 
for /f "delims=" %a in ('%GetFirstServiceState%^|%findStop%') do @set FirstServiceState=%a 
if "%FirstServiceState%"=="" (net stop %FirstServiceName%) 
set "SecondServiceState=^"^"" 
for /f "delims=" %a in ('%GetSecondServiceState%^|%findStop%') do @set SecondServiceState=%a 
if "%SecondServiceState%"=="" (net stop %SecondServiceName%) 

if "%FirstServiceState%" neq "" (if "%SecondServiceState%" neq "" (GOTO sub_StartServices) else (GOTO sub_StopServices)) else (GOTO sub_StopServices) 

:sub_StartServices 
net start %FirstServiceName% 

exit 

我遇到上面的代码是脚本的第一for线
for /f "delims=" %a in ('%GetFirstServiceState%^|%findStop%') do @set FirstServiceState=%a
停止与异常
GetFirstServiceStatefindStopa was unexpected at this time

的问题当然,这对我来说也是意想不到的当我手动运行该行时 - 它成功了!而且,假设服务已经停止,我从sc query的回应中得到STATE行。

为什么在手动运行时工作,而不是在批处理脚本中运行时工作?

只是旁注,在行set "FirstServiceState=^"^"",我基本上是清除该变量的值。当我手动运行上面的行(不工作的行),并且服务STATE不是 STOPPED,变量值不受影响...我希望它被取消或有一个空字符串但这种情况并非如此。它只是保持相同的价值。因此在测试之前,我将该值设置为双引号。

+0

里面的批处理文件的'for'替换参数需要逃脱百分号,所以'%a'变成'%% a'。你尝试过这种方式吗? –

+0

@MCND我没有......这似乎已经完成了。如果您将您的评论作为答案,我会将其标记为**答案 –

回答

2

for /?documentation状态使用批处理文件中此命令,在可替换参数使用百分号应该逃脱,使用%%a代替%a

相关问题