Как бы вы проверили, существует ли служба 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