watcher visual net filesystemwatcher1 windows batch-file

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



watcher path c# (14)

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.

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 variable de entorno errorlevel para que pueda tomar medidas al respecto.

¿Sabes de una manera simple que puedo hacer esto?

ACTUALIZAR
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?


Noté que nadie mencionó el uso de expresiones regulares al usar las respuestas basadas en find / findstr . Eso puede ser problemático para servicios con nombres similares.

CDPUserSvc que tiene dos servicios, CDPUserSvc y CDPUserSvc_54530

Si usa la mayoría de las respuestas basadas en find / findstr aquí hasta el momento, obtendrá falsos positivos para CDPUserSvc consultas de CDPUserSvc cuando solo se esté ejecutando CDPUserSvc_54530 .

Los modificadores /r y /c para findstr pueden ayudarnos a manejar ese caso de uso, así como también el carácter especial que indica el final de la línea, $

Esta consulta solo verificará la ejecución del servicio CDPUserSvc e ignorará CDPUserSvc_54530

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


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 PS en un archivo .ps1 y ejecutar como powershell myCode.ps1 , puede encontrar que 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


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 )


Solo para agregar a la lista si está usando Powershell.

sc.exe query "ServiceName" | findstr RUNNING

El siguiente comando no funciona porque sc es un alias de Set-Content 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


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

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

Puede establecer el nivel de error según si el primero arroja "VERDADERO" o el último devuelve un valor distinto de cero


Tratar

sc query state= all

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


Usa Cygwin Bash con:

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

(Asegúrese de tener sc.exe en su RUTA).


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

net start | find "Service Name"

Esto funcionará en todas partes ...


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


@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


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


sc query "ServiceName" | find "RUNNING"


sc query "servicename" | findstr STATE

por ejemplo:

sc query "wuauserv" | findstr STATE

Para informar qué está haciendo el servicio de actualización de Windows, en ejecución / en pausa, etc.
Esto también es para Windows 10. Gracias más tarde.