我有以下批處理腳本,它試圖停止一些服務(按順序),等待並確保兩者都已停止,然後啓動第一個服務。第一個服務具有第二個服務的依賴關係。這是阻止它們的命令的原因,以及只有其中一個啓動的原因。批處理腳本未能將設置變量設置爲命令結果
停止命令發出後服務可能需要一段時間纔會停止,所以我需要等待並確保它們在嘗試再次啓動它們之前已經停止。這是我想出了:
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,變量值不受影響...我希望它被取消或有一個空字符串但這種情況並非如此。它只是保持相同的價值。因此在測試之前,我將該值設置爲雙引號。
裏面的批處理文件的'for'替換參數需要逃脫百分號,所以'%a'變成'%% a'。你嘗試過這種方式嗎? –
@MCND我沒有......這似乎已經完成了。如果您將您的評論作爲答案,我會將其標記爲**答案 –