Pregunta ¿Cómo verificar si un servicio se está ejecutando a través de un archivo por lotes e iniciarlo, si no se está ejecutando?


Quiero escribir un archivo por lotes que realice las siguientes operaciones:

  • Verifica si un servicio se está ejecutando
    • Si se está ejecutando, salga del lote
    • Si no se está ejecutando, inicie el servicio

Las muestras de código que busqué en Google hasta ahora resultaron no funcionar, así que decidí no publicarlas.

El inicio de un servicio se realiza mediante:

net start "SERVICENAME"
  1. ¿Cómo puedo verificar si un servicio se está ejecutando y cómo hacer una declaración if en un archivo por lotes?
  2. Estoy un poco confundido. ¿Cuál es el argumento que tengo que pasar al inicio neto? El nombre del servicio o su nombre para mostrar?

74
2017-07-24 12:28


origen


Respuestas:


Para verificar el estado de un servicio, use sc query <SERVICE_NAME>. Para si bloques en archivos por lotes, revisa la documentación.

El siguiente código verificará el estado del servicio MyServiceName e inícielo si no se está ejecutando (el bloque if se ejecutará si el servicio no se está ejecutando):

for /F "tokens=3 delims=: " %%H in ('sc query "MyServiceName" ^| findstr "        STATE"') do (
  if /I "%%H" NEQ "RUNNING" (
   REM Put your code you want to execute here
   REM For example, the following line
   net start "MyServiceName"
  )
)

Explicación de lo que hace:

  1. Consulta las propiedades del servicio.
  2. Busca la línea que contiene el texto "ESTADO"
  3. Tokeniza esa línea y saca el tercer token, que es el que contiene el estado del servicio.
  4. Comprueba el estado resultante contra la cadena "RUNNING"

En cuanto a su segunda pregunta, el argumento que querrá pasar a net start es el nombre del servicio, no el nombre para mostrar


134
2017-07-24 12:45



Para alternar un servicio, use lo siguiente;

NET START "Transacción distribuida   Coordinador "|| NET STOP" Distribuido   Coordinador de transacciones "


27
2017-12-03 15:34



Puede usar el siguiente comando para ver si un servicio se está ejecutando o no:

sc query [ServiceName] | findstr /i "STATE"

Cuando lo ejecuto para mi NOD32 Antivirus, obtengo:

STATE                       : 4 RUNNING

Si se detuvo, obtendría:

STATE                       : 1 STOPPED

Puede usar esto en una variable para luego determinar si usa NET START o no.

El nombre del servicio debe ser el nombre del servicio, no el nombre para mostrar.


18
2017-07-24 12:36



Deberias hacer eso:

FOR %%a IN (%Svcs%) DO (SC query %%a | FIND /i "RUNNING"
IF ERRORLEVEL 1 SC start %%a)

13
2017-07-24 12:34



Versión independiente del lenguaje.

@Echo Off
Set ServiceName=Jenkins


SC queryex "%ServiceName%"|Find "STATE"|Find /v "RUNNING">Nul&&(
    echo %ServiceName% not running 
    echo Start %ServiceName%

    Net start "%ServiceName%">nul||(
        Echo "%ServiceName%" wont start 
        exit /b 1
    )
    echo "%ServiceName%" started
    exit /b 0
)||(
    echo "%ServiceName%" working
    exit /b 0
)

10
2017-08-18 07:09



Acabo de encontrar este hilo y quería agregar a la discusión si la persona no quiere usar un archivo por lotes para reiniciar los servicios. En Windows hay una opción si va a Servicios, propiedades del servicio y luego a recuperación. Aquí puede establecer parámetros para el servicio. Me gusta reiniciar el servicio si el servicio se detiene. Además, incluso puede hacer que un segundo intento fallido haga algo diferente al reiniciar la computadora.


5
2018-04-10 15:56



Cuando se usa Windows en Español, el código debe quedar asi (cuando se usa Windows en español, el código es):

for /F "tokens=3 delims=: " %%H in ('sc query MYSERVICE ^| findstr "        ESTADO"') do (
  if /I "%%H" NEQ "RUNNING" (
    REM Put your code you want to execute here
    REM For example, the following line
    net start MYSERVICE
  )
)

Reemplazar MYSERVICE con el nombre del servicio que se desea procesar. Puedes ver el nombre del servicio viendo las propiedades del servicio. (Reemplace MYSERVICE con el nombre del servicio que se procesará. Puede ver el nombre del servicio en las propiedades del servicio).


4
2017-09-03 12:29



@echo off

color 1F


@sc query >%COMPUTERNAME%_START.TXT


find /I "AcPrfMgrSvc" %COMPUTERNAME%_START.TXT >nul

IF ERRORLEVEL 0 EXIT

IF ERRORLEVEL 1 NET START "AcPrfMgrSvc"

2
2017-11-02 16:00