Как проверить, запущен ли сервис из командной строки - PullRequest
48 голосов
/ 09 декабря 2008

Я бы хотел иметь возможность запросить, работает ли служба из пакетного файла Windows. Я знаю, что могу использовать:

sc запрос "ServiceName"

но это выдает некоторый текст. Я действительно хочу, чтобы он установил переменную окружения errorlevel, чтобы я мог предпринять соответствующие действия.

Вы знаете простой способ, которым я могу это сделать?

UPDATE
Спасибо за ответы до сих пор. Я обеспокоен тем, что решения, которые разбирают текст, могут не работать в неанглийских операционных системах. Кто-нибудь знает способ обойти это, или мне придется прикусить пулю и написать консольную программу, чтобы сделать это правильно.

Ответы [ 14 ]

70 голосов
/ 09 декабря 2008
sc query "ServiceName" | find "RUNNING"
16 голосов
/ 23 марта 2011

Вернемся к старой школе пакетного программирования на Windows

net start | find "Service Name"

Это будет работать везде ...

8 голосов
/ 09 декабря 2008

Если вы не против объединить команду net с grep, вы можете использовать следующий скрипт.

@echo off
net start | grep -x "Service"
if %ERRORLEVEL% == 2 goto trouble
if %ERRORLEVEL% == 1 goto stopped
if %ERRORLEVEL% == 0 goto started
echo unknown status
goto end
:trouble
echo trouble
goto end
:started
echo started
goto end
:stopped
echo stopped
goto end
:end
6 голосов
/ 28 декабря 2008

Вы можете использовать wmic с опцией / locale

call wmic /locale:ms_409 service where (name="wsearch") get state /value | findstr State=Running
if %ErrorLevel% EQU 0 (
    echo Running
) else (
    echo Not running
)
3 голосов
/ 15 декабря 2012

Я бы предложил WMIC Service WHERE "Name = 'SericeName'" GET Started

или WMIC Service WHERE "Name = 'ServiceName'" GET ProcessId (ProcessId будет нулевым, если служба не запущена)

Вы можете установить уровень ошибки в зависимости от того, вернет ли первое значение «ИСТИНА» или последнее вернет ненулевое значение

3 голосов
/ 21 июля 2009

Думая немного нестандартно здесь, я собираюсь предложить, что powershell может быть ответом на современные машины XP / 2003 и, конечно, на Vista / 2008 и новее (вместо .bat / .cmd) , Любой, у кого есть немного Perl на заднем плане, должен чувствовать себя как дома довольно быстро.


$serviceName = "ServiceName";
$serviceStatus = (get-service "$serviceName").Status;

if ($serviceStatus -eq "Running") {
    echo "Service is Running";
}
else {
    #Could be Stopped, Stopping, Paused, or even Starting...
    echo "Service is $serviceStatus";
}

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


@ECHO off
SET PS=powershell -nologo -command
%PS% "& {if((get-service SvcName).Status -eq 'Running'){exit 1}}"

ECHO.%ERRORLEVEL%

Работа в режиме одной строки также обходит стандартную политику подписывания кода PS за счет беспорядка. Чтобы поместить команды PS в файл .ps1 и выполнить их как powershell myCode.ps1, вы можете обнаружить, что для подписи сценариев powershell необходимо запускать их автоматически (зависит от вашей среды). Подробнее см. http://www.hanselman.com/blog/SigningPowerShellScripts.aspx

2 голосов
/ 01 декабря 2016
sc query "servicename" | findstr STATE

например:

sc query "wuauserv" | findstr STATE

Чтобы сообщить о том, что служба обновлений Windows работает, работает / приостановлена ​​и т. Д.
Это также для Windows 10. Спасибо, позже.

2 голосов
/ 09 декабря 2008

Попробуйте

sc query state= all 

для списка сервисов и того, запущены они или нет.

1 голос
/ 23 декабря 2016
@ECHO OFF
REM testing at cmd : sc query "MSSQLSERVER" | findstr RUNNING
REM "MSSQLSERVER" is the name of Service for sample
sc query "MSSQLSERVER" %1 | findstr RUNNING
if %ERRORLEVEL% == 2 goto trouble
if %ERRORLEVEL% == 1 goto stopped
if %ERRORLEVEL% == 0 goto started
echo unknown status
goto end
:trouble
echo Oh noooo.. trouble mas bro
goto end
:started
echo "SQL Server (MSSQLSERVER)" is started
goto end
:stopped
echo "SQL Server (MSSQLSERVER)" is stopped
echo Starting service
net start "MSSQLSERVER"
goto end
:erro
echo Error please check your command.. mas bro 
goto end

:end
1 голос
/ 09 декабря 2008

Я нашел это:

  sc query "ServiceName" | findstr RUNNING  

, кажется, делает примерно правильно. Но я боюсь, что это не достаточно обобщенно, чтобы работать на неанглийских операционных системах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...