Если сервис существует Условие

Как бы вы проверили, существует ли служба WIN32 и если да, выполните некоторую операцию?

Ответ 1

Сверху моей головы вы можете проверить, работает ли определенная служба, как упоминается bmargulies, используя команду "net", передавая результат в "find". Что-то вроде следующего будет проверять, была ли служба запущена, и если так прекратить ее. Затем вы можете запустить его, не беспокоясь о том, что он уже запущен или нет:

net start | find "SomeService"
if ERRORLEVEL 1 net stop "SomeService"
net start "SomeService"

Если вы используете findstr для поиска, как предложили некоторые из других ответов, тогда вы должны проверить, что ERRORLEVEL равен 0 (ноль)... если это так, вы нашли строку, которую вы ищу:

net start | findstr "SomeService"
if ERRORLEVEL 0 net stop "SomeService"
net start "SomeService"

По сути, большинство команд DOS устанавливают ERRORLEVEL, позволяя вам проверить, удалось ли что-то вроде find найти.

Ответ 2

Вы не можете сделать это в DOS, поскольку DOS не Windows и даже не имеет понятия "сервис".

В пакетном файле Windows вы можете использовать команду sc для поиска служб:

sc query | findstr SERVICE_NAME

Это будет перечислять все службы и давать их соответствующие имена.

Вы можете выполнить поиск определенной службы с помощью

sc query | findstr /C:"SERVICE_NAME: myservice"

Помните, что этот поиск чувствителен к регистру. Вы можете добавить переключатель /I в findstr, чтобы избежать этого.

Ответ 3

Просто добавление к принятому ответу. Если вы хотите сделать что-то другое, кроме просто перезапуска службы, и посмотрите, установлена ​​ли служба.

sc query state= all | findstr /C:"SERVICE_NAME: MyService" 
if ERRORLEVEL 0 (**My Operation**)

В этом случае состояние = все важно, поскольку, если служба не запущена, она будет интерпретироваться как не установленная, которая представляет собой две отдельные вещи.

Ответ 4

Не следует проверять успех: "if (not) errorlevel 1"??

В оболочке Windows "если уровень ошибок #" означает, что уровень ошибок равен # или выше, поэтому "если errorlevel 0" всегда истинно.

Ответ 5

Я использую следующий код:

SC QUERY | FIND "SERVICE_NAME: MyService"
IF %ERRORLEVEL% EQU 0 NET STOP MyService

Если MyService не найден,% ERRORLEVEL% будет установлен в 1 на FIND, иначе он останется на 0. Команда IF% ERRORLEVEL% EQU 0 позволяет проверить этот последний случай и выполните операцию с вашим сервисом.

IF ERRORLEVEL 0 NET STOP MyService

не будет работать, потому что он выполняет команду, если% ERRORLEVEL% больше или равно нулю.

В событии post post для Visual Studio вам нужно поставить:

EXIT 0

в конце, потому что VS обнаружит, что% ERRORLEVEL%!= 0, и будет считать, что событие post build завершилось с ошибкой. Используйте это с осторожностью, потому что это скроет все ошибки в вашей последовательности команд.

С помощью этого трюка вы можете проигнорировать ошибку и использовать ее в своем post build event для перезапуска вашей службы:

NET STOP MyService
NET START MyService
EXIT 0

Ответ 6

Как насчет использования WMIC:

Сначала перечислите все процессы, затем grep имя процесса. Никакой результат не будет напечатан, если он не существует.

wmic service |findstr "ProcessName"

Пример:

C:\>wmic service |findstr "Search"
FALSE        TRUE        Windows Search