批处理脚本无法将变量设置为命令结果

时间:2015-09-08 14:45:19

标签: batch-file

我有以下Batch脚本尝试停止一些服务(按顺序),等待并确保两者都已停止,然后启动第一个服务。第一个服务具有第二个服务的依赖性。这就是停止它们的顺序的原因,以及只有其中一个启动的原因。

在发出停止命令后,服务可能需要一段时间才能停止,因此我需要等待并确保它们已经停止,然后再尝试启动它们。这就是我想出的:

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

当然,当我手动运行该行时,它对我来说也是意外的 - 它成功了!并且,假设服务已停止,我会从STATE的响应中获得sc query行。

为什么在手动运行时会起作用,而在批处理脚本中运行时却不起作用?

只是旁注,在set "FirstServiceState=^"^""行中,我基本上清除了该变量的值。当我手动运行上面的行(那个没有工作的行)并且服务STATE 不是 STOPPED时,那些变量值不受影响...我希望它无效或者有一个空字符串,但事实并非如此。它只是保持相同的价值。所以在测试之前,我将值设置为双引号。

1 个答案:

答案 0 :(得分:2)

for /?documentation说明要在批处理文件中使用此命令,应使用%%a代替{{1}转义可替换参数中使用的百分号。 }