2013-02-27 1 views
0

У меня есть довольно простая задача для достижения, но я получаю полный noob в сценариях командной строки. Я столкнулся с ошибкой и нашел некоторые из основных команд для взаимодействия с сервисами на компьютере с Windows, но ничто в аспектах проверки, запущена или остановлена ​​служба. Я надеюсь, что кто-то может помочь со сценарием, который остановит 3 службы, убедитесь, что все 3 остановлены, и как только все остановлены, попробуйте снова их вернуть. Мне нужно убедиться, что все 3 остановлены, прежде чем запускать любую из них. Я знаю, как остановить и начать услуги, но остальное - это место, где я застрял.Как остановить службу Windows, проверить, была ли она остановлена, и запустить ее снова с помощью Cmd Line?

net Stop S1 
net Stop S2 
net Stop S3 

//Check if all 3 are stopped 

//If all 3 have been stopped successfully 
net start s1 
net start s2 
net start s3 

Я придумал это, но не думаю, что синтаксис является правильным ...

net stop PriceIdxImport 
net stop RawDataImportDB 
net stop DBDailyTrxProcessService 

set Pstate = sc query PriceIdxImport state 
set Rstate = sc query RawDataImportDB state 
set Dstate = sc query DBDailyTrxProcessService state 

if Pstate == Inactive if Rstate == Inactive if Dstate == Inactive GOTO sub_StartServices 

:sub_StartServices 
net start PriceIdxImport 
net start RawDataImportDB 
net start DBDailyTrxProcessService 

Хорошо я взял выше сценарий и переделал его в какое-то время loop..it Doesnt сделать петлю правильно? Он проверил состояние и затем выходит :(

echo on 
net stop PriceIdxImport 
net stop RawDataImportDB 
net stop DBDailyTrxProcessService 
ping -n 5 127.0.0.1 > nul 
set Pstate = Sc query PriceIdxImport |find /i "STOPPED" 
set Rstate = sc query RawDataImportDB |find /i "STOPPED" 
set Dstate = sc query DBDailyTrxProcessService |find /i "STOPPED" 
set Condition="false" 

while Condition="false";do if Pstate neq "" (if Rstate neq "" (if Dstate neq ""   GOTO sub_StartServices));done 
exit 

:sub_StartServices 
set Condition="true" 
net start PriceIdxImport 
net start RawDataImportDB 
net start DBDailyTrxProcessService 
+0

значения переменных в пакете должно быть сделано так: 'установить вар = Foo bar' (без пробелов вокруг' = ') –

+0

Хорошо, я изменил три оператора набора, чтобы не было пробелов, чтобы он соответствовал формату var = xxx. – user1732364

ответ

0

Пожалуйста, попробуйте этот скрипт

echo on 
:sub_StopServices  
net stop PriceIdxImport 
net stop RawDataImportDB 
net stop DBDailyTrxProcessService 

set Pstate = Sc query PriceIdxImport |find /i "STOPPED" 
set Rstate = sc query RawDataImportDB |find /i "STOPPED" 
set Dstate = sc query DBDailyTrxProcessService |find /i "STOPPED" 

if Pstate neq "" (if Rstate neq "" (if Dstate neq "" (GOTO sub_StartServices) else (GOTO sub_StopServices)) else (GOTO sub_StopServices)) else (GOTO sub_StopServices) 
exit 
:sub_StartServices 
net start PriceIdxImport 
net start RawDataImportDB 
net start DBDailyTrxProcessService 
+3

Я бы рекомендовал использовать' net start | stop' over 'sc start | stop', потому что последний не блокирует –

+0

делает все возможное, чтобы использовать его. Plus sc специально написан для обработки сервисов ... хотя в конце, если день сжимается до тех пор, tyle кодирования :) –

+0

Независимо от того, желательны ли неблокирующие операции, зависит фактические требования/обстоятельства. В случае OP я, безусловно, предпочел бы операцию блокировки, потому что это избавит меня от необходимости проверять статус службы в цикле (и с таймаутом). –