¿Cómo puedo escribir un bat o cmd para detener e iniciar un servicio de manera confiable con la comprobación de errores (o informarme que no fue exitoso por alguna razón)?
288
¿Cómo puedo escribir un bat o cmd para detener e iniciar un servicio de manera confiable con la comprobación de errores (o informarme que no fue exitoso por alguna razón)?
Respuestas:
Use el
SC
comando (control de servicio), le brinda muchas más opciones que solostart
&stop
.fuente
y
decirle si han tenido éxito o fallado con bastante claridad. Por ejemplo
Si se ejecuta desde un archivo por lotes, tiene acceso al ERRORLEVEL del código de retorno. 0 indica éxito. Cualquier cosa más alta indica fracaso.
Como un archivo bat
error.bat
:El resultado se ve así:
Códigos de retorno
Editar 20.04.2015
Códigos de retorno:
Mire aquí: http://ss64.com/nt/net_service.html
fuente
NET
no es solo para funciones relacionadas con el servicio, mientras queSC
es solo para funciones relacionadas con el servicio.errorlevel
devuelto es 2, vea aquí cómo interpretar el resultado del error .Puede usar el comando NET START y luego verificar la variable de entorno ERRORLEVEL, p. Ej.
Descargo de responsabilidad: he escrito esto desde la parte superior de mi cabeza, pero creo que funcionará.
fuente
En lugar de verificar códigos, esto también funciona
fuente
He creado mi archivo por lotes personal para esto, el mío es un poco diferente, pero puede modificarlo como mejor le parezca. Creé esto hace un tiempo porque estaba aburrido y quería hacer una manera simple para que las personas pudieran ingresar el final, el inicio, la detención o la configuración en automático. Este archivo BAT simplemente le solicita que ingrese el nombre del servicio y hará el resto por usted. No me di cuenta de que estaba buscando algo que indicara algún error, debo haber leído mal esa parte. Aunque normalmente esto se puede hacer ingresando >> output.txt al final de la línea.
El% var% es solo una forma para que el usuario pueda ingresar su propio servicio en este, en lugar de tener que modificar el archivo bat cada vez que desee iniciar / detener un servicio diferente.
Si me equivoco, cualquiera puede sentirse libre de corregirme al respecto.
fuente
Usar los códigos de retorno de
net start
y menet stop
parece el mejor método. Pruebe esto: los códigos de retorno de Net Start .fuente
La sintaxis siempre me atrapa ... así que ...
Aquí se explica explícitamente cómo agregar una línea a un archivo por lotes que eliminará un servicio remoto (en otra máquina) si es administrador en ambas máquinas, ejecute .bat como administrador y las máquinas estén en el mismo dominio. El nombre de la máquina sigue el formato UNC \ myserver
En este caso ... p4_1 era tanto el Nombre del servicio como el Nombre para mostrar, cuando ve las Propiedades del servicio en el Administrador de servicios. Debe usar el nombre del servicio.
Para sus adictos a Service Ops ... ¡asegúrese de agregar su código de razón y comentar! es decir, '4' que equivale a 'Planificado' y comentar 'Detener el servidor por mantenimiento'
fuente
CMD
como el otro usuario / ID yrunas /user:Domain\UserName cmd
luego ingresas tu contraseña. CMD comenzará a ejecutarse como la cuenta de usuario especificada.Nos gustaría pensar que "net stop" detendrá el servicio. Lamentablemente, la realidad no es tan en blanco y negro. Si el servicio tarda mucho en detenerse, el comando volverá antes de que se detenga. Sin embargo, no lo sabrá, a menos que marque el nivel de error.
La solución parece ser recorrer todo el ciclo buscando el estado del servicio hasta que se detenga, con una pausa cada vez que se completa el ciclo.
Pero entonces de nuevo...
Estoy viendo que el primer servicio tarda mucho en detenerse, luego la "parada neta" para un servicio posterior parece no hacer nada. Mire el servicio en el administrador de servicios, y su estado todavía está "Iniciado", sin cambios en "Deteniendo". Sin embargo, puedo detener este segundo servicio manualmente usando el SCM, y se detiene en 3 o 4 segundos.
fuente
o puede iniciar el servicio remoto con este cmd:
sc \\<computer> start <service>
fuente
Acabo de usar el ejemplo anterior de Jonas y creé una lista completa de 0 a 24 niveles de error. Otra publicación es correcta
net start
ynet stop
solo usaerrorlevel
0 para el éxito y 2 para el fracaso.Pero esto es lo que funcionó para mí:
Cambiar
stop
astart
y funciona a la inversa.fuente
El reinicio manual del servicio está bien: services.msc tiene el botón "Reiniciar", pero en la línea de comando los comandos sc y net carecen de un interruptor "reiniciar" y si el reinicio está programado en el archivo cmd / bat, el servicio se detiene y se inicia de inmediato, a veces recibe un error porque el servicio aún no se ha detenido, necesita algo de tiempo para apagar las cosas.
Esto puede generar un error: sc stop sc start
Es una buena idea insertar tiempo de espera, utilizo ping (suena cada 1 segundo): sc stop ping localhost -n 60 sc start
fuente
Aquí está el comando de Windows 10 para iniciar Restaurar sistema usando lote:
También te pueden gustar esos comandos:
Cambiar el valor del registro para iniciar automáticamente la restauración del sistema
REG AÑADIR "HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ SystemRestore" / v DisableSR / t REG_DWORD / d 0 / f
Crear un punto de restauración del sistema
Wmic.exe / Namespace: \ root \ default Ruta SystemRestore Llame a CreateRestorePoint "djibe salvó su PC", 100, 12
Cambiar el uso del disco de Restaurar sistema
vssadmin cambiar el tamaño del almacenamiento de sombras / for = C: / on = C: / maxsize = 10%
Disfrutar
fuente
SC
puede hacer todo con los servicios ... iniciar, detener, verificar, configurar y más ...fuente
A veces puedes encontrar que la parada no funciona.
Mi SQlServer a veces hace esto. Usar la siguiente línea de comando lo mata. Si realmente necesitas tu script para matar cosas que no se detienen. Me gustaría que hiciera esto como último recurso
fuente
Estoy escribiendo un servicio de Windows en C #, el ciclo de detención / desinstalación / compilación / instalación / inicio se cansó demasiado. Escribí un mini script, lo llamé
reploy.bat
y lo coloqué en mi directorio de salida de Visual Studio (uno que tiene el ejecutable del servicio integrado) para automatizar el bucle.Solo configura estos 3 vars
servicename
: esto aparece en el panel de control del Servicio de Windows (services.msc)slndir
: carpeta (no la ruta completa) que contiene su archivo de solución (.sln)binpath
: ruta completa (no la ruta de la carpeta) al servicio ejecutable desde la compilaciónNOTA: Esto debe ejecutarse desde la línea de comandos del desarrollador de Visual Studio para que el
msbuild
comando funcione.Tal vez esto ayude a alguien :)
fuente