Ответ 1
sc query "ServiceName" | find "RUNNING"
Я хотел бы иметь возможность запросить, работает ли служба из пакетного файла Windows. Я знаю, что могу использовать:
sc query "ServiceName"
но это сбрасывает какой-то текст. Я действительно хочу, чтобы он установил переменную среды errorlevel
, чтобы я мог принять меры для этого.
Знаете ли вы простой способ, которым я могу это сделать?
UPDATE
Спасибо за ответы. Я волнуюсь, решения, которые анализируют текст, могут не работать на неанглийских операционных системах. Кто-нибудь знает об этом, или мне придется укусить пулю и написать консольную программу, чтобы понять это.
sc query "ServiceName" | find "RUNNING"
Вернемся к старой школе пакетного программирования в окнах
net start | find "Service Name"
Это будет работать везде...
Если вы не возражаете, чтобы объединить команду 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
Вы можете использовать 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
)
Думая немного за пределами коробки, я собираюсь предложить, что 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
sc query "servicename" | findstr STATE
например:
sc query "wuauserv" | findstr STATE
Сообщать, что делает служба обновления Windows, запускать/приостанавливать и т.д.
Это также для Windows 10. Спасибо позже.
Я нашел это:
sc query "ServiceName" | findstr RUNNING
похоже, делает правильную вещь. Но я волнуюсь, что недостаточно обобщен для работы на не-английских операционных системах.
Я бы предложил
WMIC Service WHERE "Name = 'SericeName'" GET Started
или WMIC Service WHERE "Name = 'ServiceName'" GET ProcessId
(ProcessId будет равен нулю, если служба не запущена)
Вы можете установить уровень ошибки на основе того, будет ли прежний возвращать значение "ИСТИНА", или последнее возвращает ненулевое значение
Попробуйте
sc query state= all
для списка услуг и независимо от того, запущены они или нет.
Просто добавьте в список, если вы используете Powershell.
sc.exe query "ServiceName" | findstr RUNNING
Приведенная ниже команда не работает, потому что sc
является псевдонимом Set-Content в Powershell.
sc query "ServiceName" | findstr RUNNING
find
также не работает на Powershell по неизвестной мне причине.
sc.exe query "ServiceName" | find RUNNING
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
@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
Используйте Cygwin Bash с помощью:
sc query "SomeService" |grep -qo RUNNING && echo "SomeService is running." || echo "SomeService is not running!"
(Убедитесь, что у вас есть sc.exe
в PATH.)