Если сервис существует условие - PullRequest
10 голосов
/ 16 декабря 2009

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

Ответы [ 6 ]

18 голосов
/ 16 декабря 2009

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

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

sc query | findstr SERVICE_NAME

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

Вы можете искать определенную услугу с помощью

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

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

12 голосов
/ 16 декабря 2009

Вверху моей головы, вы можете проверить, работает ли конкретная служба, как упомянуто 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, что позволяет вам проверить, удалось ли что-то вроде поиска.

5 голосов
/ 03 сентября 2013

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

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

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

3 голосов
/ 26 июня 2015

Я использую код ниже:

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% больше или равен нулю.

В событии пост-сборки Visual Studio вы должны указать:

EXIT 0

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

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

NET STOP MyService
NET START MyService
EXIT 0
3 голосов
/ 22 декабря 2013

Не должен быть проверен на успех: «если (не) уровень ошибки 1» ??

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

1 голос
/ 17 декабря 2009

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

Сначала перечислите все процессы, затем введите имя вашего процесса. Результат не будет напечатан, если он не существует.

wmic service |findstr "ProcessName"

Пример:

C:\>wmic service |findstr "Search"
FALSE        TRUE        Windows Search
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...