Cómo probar si un servicio se está ejecutando desde la línea de comando

votos
42

Me gustaría poder consultar si un servicio se está ejecutando o no desde un archivo de lote de Windows. Sé que puedo usar:

consulta sc ServiceName

pero, esto arroja algo de texto. Lo que realmente quiero es que establezca la errorlevelvariable de entorno para que pueda tomar medidas al respecto.

¿Sabes de una manera simple que puedo hacer esto?

ACTUALIZACIÓN
Gracias por las respuestas hasta ahora. Me preocupa que las soluciones que analizan el texto no funcionen en sistemas operativos que no sean en inglés. ¿Alguien sabe una forma de evitar esto, o voy a tener que morder la bala y escribir un programa de consola para hacerlo bien?

Publicado el 09/12/2008 a las 16:37
fuente por usuario
En otros idiomas...                            


14 respuestas

votos
65

sc query "ServiceName" | find "RUNNING"
Respondida el 09/12/2008 a las 16:46
fuente por usuario

votos
14

Volvamos a la vieja escuela de la programación por lotes en las ventanas

net start | find "Service Name"

Esto funcionará en todas partes ...

Respondida el 23/03/2011 a las 15:22
fuente por usuario

votos
8

si no te importa combinar el comando net con grep, puedes usar el siguiente 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
Respondida el 09/12/2008 a las 16:48
fuente por usuario

votos
4

Podría usar wmic con la opción / 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
)
Respondida el 28/12/2008 a las 20:05
fuente por usuario

votos
2
sc query "servicename" | ESTADO findstr

por ejemplo:

sc query "wuauserv" | ESTADO findstr

Para informar de lo que el servicio de actualización de Windows está haciendo, corriendo / pausa, etc.
Esto también es para Windows 10. después me gracias.

Respondida el 01/12/2016 a las 02:08
fuente por usuario

votos
2

Yo sugeriría WMIC Service WHERE "Name = 'SericeName'" GET Started

o WMIC Service WHERE "Name = 'ServiceName'" GET ProcessId(ProcessId será cero si no se inicia el servicio)

Es posible ajustar el nivel de error en función de si los antiguos devuelve "verdadero" o éste vuelve distinto de cero

Respondida el 14/12/2012 a las 21:27
fuente por usuario

votos
2

Pensando un poco fuera de la caja aquí voy a proponer que PowerShell puede ser una respuesta en máquinas actualizadas XP / 2003 y ciertamente en Vista / 2008 y más reciente (en lugar de .bat / .cmd). Cualquiera que tenga algo de Perl en su entorno debería sentirse en casa con bastante rapidez.


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

Otra forma, si tiene una inversión significativa en lotes, es ejecutar el script PS como una línea, devolviendo un código de salida.


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

ECHO.%ERRORLEVEL%

Al correr como una línea, también se evita la política de firma del código de la PS a expensas del desorden. Para poner los comandos de PS en un archivo .ps1 y ejecutar como powershell myCode.ps1puede encontrar, la firma de sus scripts de powershell es necesaria para ejecutarlos de manera automática (depende de su entorno). Ver http://www.hanselman.com/blog/SigningPowerShellScripts.aspx para detalles

Respondida el 20/07/2009 a las 21:48
fuente por usuario

votos
1

He encontrado esto:

  sc query "ServiceName" | findstr RUNNING  

parece hacer más o menos lo correcto. Pero me preocupa que no sea lo suficientemente generalizado para funcionar en sistemas operativos que no sean ingleses.

Respondida el 09/12/2008 a las 16:48
fuente por usuario

votos
1

Tratar

sc query state= all 

para obtener una lista de servicios y si se están ejecutando o no.

Respondida el 09/12/2008 a las 16:47
fuente por usuario

votos
0

Me di cuenta de que nadie ha mencionado el uso de expresiones regulares cuando se utiliza find/ findstrrespuestas basadas. Esto puede ser problemático para los servicios con nombres similares.

Digamos que tiene dos servicios, CDPUserSvcyCDPUserSvc_54530

Si utiliza la mayor parte de los find/ findstrlas respuestas basadas aquí hasta ahora, obtendrá los falsos positivos para CDPUserSvcconsultas, cuando sólo CDPUserSvc_54530se está ejecutando.

El /re /cinterruptores para findstrpuede ayudarnos a manejar que los casos de uso, así como el carácter especial que indica el final de la línea,$

Esta consulta sólo se verificará el funcionamiento del CDPUserSvcservicio y hacer caso omisoCDPUserSvc_54530

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

Respondida el 13/02/2018 a las 02:45
fuente por usuario

votos
0

Usar Cygwin Bash con:

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

(Asegúrese de que tiene sc.exeen su PATH).

Respondida el 18/12/2017 a las 05:02
fuente por usuario

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
Respondida el 22/12/2016 a las 23:42
fuente por usuario

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
Respondida el 05/12/2016 a las 15:53
fuente por usuario

votos
0

Sólo para añadir a la lista si está utilizando PowerShell.

sc.exe query "ServiceName" | findstr RUNNING

El comando de abajo no funciona porque sces un alias a Set-contenido dentro de Powershell.

sc query "ServiceName" | findstr RUNNING

find También no funciona en Powershell por alguna razón desconocida para mí.

sc.exe query "ServiceName" | find RUNNING
Respondida el 04/08/2016 a las 06:07
fuente por usuario

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