Подтвердить что ты не робот

Как проверить, запущена ли служба из командной строки

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

sc query "ServiceName"

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

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

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

4b9b3361

Ответ 1

sc query "ServiceName" | find "RUNNING"

Ответ 2

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

net start | find "Service Name"

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

Ответ 3

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

@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

Ответ 4

Вы можете использовать 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
)

Ответ 5

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


@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

Ответ 6

sc query "servicename" | findstr STATE

например:

sc query "wuauserv" | findstr STATE

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

Ответ 7

Я нашел это:

  sc query "ServiceName" | findstr RUNNING  

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

Ответ 8

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

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

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

Ответ 9

Попробуйте

sc query state= all 

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

Ответ 10

Просто добавьте в список, если вы используете Powershell.

sc.exe query "ServiceName" | findstr RUNNING

Приведенная ниже команда не работает, потому что sc является псевдонимом Set-Content в Powershell.

sc query "ServiceName" | findstr RUNNING

find также не работает на Powershell по неизвестной мне причине.

sc.exe query "ServiceName" | find RUNNING

Ответ 11

SERVICO.BAT
@echo off
echo Servico: %1
if "%1"=="" goto erro
sc query %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 trouble
goto end
:started
echo started
goto end
:stopped
echo stopped
goto end
:erro
echo sintaxe: servico NOMESERVICO
goto end

:end

Ответ 12

@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

Ответ 13

Используйте Cygwin Bash с помощью:

sc query "SomeService" |grep -qo RUNNING && echo "SomeService is running." || echo "SomeService is not running!"

(Убедитесь, что у вас есть sc.exe в PATH.)