Quiero escribir un archivo por lotes que realice las siguientes operaciones:
- Compruebe si se está ejecutando un servicio
- Si se está ejecutando, salga del lote
- Si no se está ejecutando, inicie el servicio
Los ejemplos de código que busqué en Google hasta ahora resultaron no funcionar, así que decidí no publicarlos.
El inicio de un servicio se realiza mediante:
net start "SERVICENAME"
- ¿Cómo puedo verificar si un servicio se está ejecutando y cómo hacer una declaración if en un archivo por lotes?
- 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?
Respuestas:
Para comprobar el estado de un servicio, utilice
sc query <SERVICE_NAME>
. Si hay bloques en archivos por lotes, consulte la documentación .El siguiente código verificará el estado del servicio
MyServiceName
y lo iniciará si no se está ejecutando (el bloque if se ejecutará si el servicio no se está ejecutando):Explicación de lo que hace:
En cuanto a su segunda pregunta, el argumento al que querrá pasar
net start
es el nombre del servicio, no el nombre para mostrar.fuente
sc query "SCardSvr"
desde una línea de comando?Para alternar un servicio, utilice lo siguiente;
fuente
||
realidad es unOR
operador, aunque en este caso es funcionalmente unaELSE
declaración. Ésta es una diferencia sutil pero importante. Todavía tengo mi +1: hago esto todo el tiempo en secuencias de comandos de shell de Unix / Linux, no sé por qué nunca pensé en hacer esto en lotes de Windows.Puede usar el siguiente comando para ver si un servicio se está ejecutando o no:
Cuando lo ejecuto para mi NOD32 Antivirus, obtengo:
Si se detuviera, obtendría:
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.
fuente
Deberias hacer eso:
fuente
Versión independiente del idioma.
fuente
Set ServiceName=Jenkins
conSet ServiceName=%~1
ywatch-service.bat "Jenkins"
Acabo de encontrar este hilo y quería agregarlo 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 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, como reiniciar la computadora.
fuente
Cuando se usa Windows en español, el código debe quedar así (cuando se usa Windows en español, el código es):
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).
fuente
fuente
Para Windows Server 2012 a continuación es lo que funcionó para mí. Reemplace solo "SERVICENAME" con el nombre real del servicio:
fuente
También quería que se enviara un correo electrónico si el servicio se iniciaba de esta manera, así que agregué un poco al código @Ic, solo pensé en publicarlo en caso de que ayudara a alguien. Usé SendMail pero hay otras opciones de línea de comandos. ¿Cómo enviar un correo electrónico simple desde un archivo por lotes de Windows?
fuente
Inicio del servicio usando el script de Powershell. Puede vincularlo al programador de tareas y activarlo a intervalos o según sea necesario. Cree esto como un archivo PS1, es decir, un archivo con extensión PS1 y luego deje que este archivo se active desde el programador de tareas.
Para iniciar el servicio de parada
en el programador de tareas si lo está usando en el servidor, use esto en los argumentos
-noprofile -executionpolicy bypass -file "C: \ Service Restart Scripts \ StopService.PS1"
verifique ejecutando lo mismo en cmd si funciona, también debería funcionar en el programador de tareas
fuente
fuente
Relacionado con la respuesta de @DanielSerrano, recientemente me ha mordido la localización del
sc.exe
comando, es decir, en español. Mi propuesta es señalar la línea y el token que contiene el estado de servicio numérico e interpretarlo, que debería ser mucho más robusto:Probado con:
fuente
¿Quizás de una forma mucho más sencilla? Solo agregando a la lista de respuestas aquí:
fuente