Como testar se um serviço está sendo executado a partir da linha de comando

votos
42

Eu gostaria de ser capaz de consultar ou não de um serviço está sendo executado a partir de um arquivo de janelas lote. Eu sei que eu posso usar:

consulta sc ServiceName

mas, este despeja algum texto. O que eu realmente quero é para que ele defina a errorlevelvariável de ambiente para que eu possa tomar medidas sobre isso.

Sabe uma maneira simples eu posso fazer isso?

ATUALIZAÇÃO
Agradecimentos para as respostas até agora. Estou preocupado as soluções que analisam o texto pode não funcionar em sistemas operativos não Inglês. Alguém sabe uma maneira de contornar isso, ou eu vou ter que morder a bala e escrever um programa de console para obter este direito.

Publicado 09/12/2008 em 16:37
fonte usuário
Em outras línguas...                            


14 respostas

votos
65

sc query "ServiceName" | find "RUNNING"
Respondeu 09/12/2008 em 16:46
fonte usuário

votos
14

Vamos voltar à velha escola de programação batch no Windows

net start | find "Service Name"

Isto irá funcionar em todos os lugares ...

Respondeu 23/03/2011 em 15:22
fonte usuário

votos
8

Se você não se importa de combinar o comando net com grep você pode usar o seguinte 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
Respondeu 09/12/2008 em 16:48
fonte usuário

votos
4

Você poderia usar wmic com o / locale opção

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
)
Respondeu 28/12/2008 em 20:05
fonte usuário

votos
2
consulta sc "servicename" | ESTADO findstr

por exemplo:

consulta sc "wuauserv" | ESTADO findstr

Para relatar o que o serviço de atualização do Windows está fazendo, correndo / pausado etc.
Esta é também para Windows 10. Agradeça-me mais tarde.

Respondeu 01/12/2016 em 05:08
fonte usuário

votos
2

eu sugeriria WMIC Service WHERE "Name = 'SericeName'" GET Started

ou WMIC Service WHERE "Name = 'ServiceName'" GET ProcessId(ProcessId será zero se o serviço não for iniciado)

Você pode definir o nível de erro com base em se os antigos retorna "TRUE" ou o último retorna diferente de zero

Respondeu 14/12/2012 em 21:27
fonte usuário

votos
2

Pensando um pouco fora da caixa aqui eu vou propor que PowerShell pode ser uma resposta sobre up-to-date XP máquinas / 2003 e, certamente, em Vista / 2008 e mais recentes (em vez de .bat / .cmd). Qualquer um que tenha alguma Perl em seu fundo deve se sentir em casa muito rapidamente.


$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";
}

De outra forma, se você tem um investimento significativo em lote é para executar o script PS como um one-liner, retornando um código de saída.


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

ECHO.%ERRORLEVEL%

Correndo como um one-liner também recebe em torno da política de assinatura de código PS padrão à custa de confusão. Para colocar os comandos PS em um arquivo .ps1 e correr como powershell myCode.ps1você pode encontrar assinar seus scripts PowerShell é neccessary para executá-los de forma automatizada (depende do ambiente). Veja http://www.hanselman.com/blog/SigningPowerShellScripts.aspx para mais detalhes

Respondeu 20/07/2009 em 21:48
fonte usuário

votos
1

Eu encontrei este:

  sc query "ServiceName" | findstr RUNNING  

parece fazer mais ou menos a coisa certa. Mas, eu estou preocupado que não é generalizado o suficiente para trabalhar em sistemas operacionais diferentes do inglês.

Respondeu 09/12/2008 em 16:48
fonte usuário

votos
1

Experimentar

sc query state= all 

para uma lista de serviços e se eles estão funcionando ou não.

Respondeu 09/12/2008 em 16:47
fonte usuário

votos
0

Notei ninguém mencionou o uso de expressões regulares ao usar find/ findstrRespostas baseados. Isso pode ser problemático para os serviços de nome semelhante.

Vamos dizer que você tem dois serviços, CDPUserSvceCDPUserSvc_54530

Se você usar a maioria dos find/ findstrRespostas baseados aqui até agora, você vai ter resultados falso-positivos para CDPUserSvcconsultas quando apenas CDPUserSvc_54530está em execução.

O /re /cinterruptores para findstrpode nos ajudar a lidar com isso de caso de uso, bem como o carácter especial que indica o fim da linha,$

Esta consulta só irá verificar o funcionamento do CDPUserSvcserviço e ignorarCDPUserSvc_54530

sc query|findstr /r /c:"CDPUserSvc$"

Respondeu 13/02/2018 em 05:45
fonte usuário

votos
0

Utilize Cygwin Bash com:

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

(Certifique-se de que você tem sc.exeem seu caminho.)

Respondeu 18/12/2017 em 08:02
fonte usuário

votos
0
@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
Respondeu 23/12/2016 em 02:42
fonte usuário

votos
0
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
Respondeu 05/12/2016 em 18:53
fonte usuário

votos
0

Só para acrescentar sobre a lista se você estiver usando o PowerShell.

sc.exe query "ServiceName" | findstr RUNNING

O comando a seguir não funciona porque scé um alias para Set-Content dentro PowerShell.

sc query "ServiceName" | findstr RUNNING

find também não funciona em Powershell por alguma razão desconhecida para mim.

sc.exe query "ServiceName" | find RUNNING
Respondeu 04/08/2016 em 09:07
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more