2015-09-08 108 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

相關問題