Pregunta

Necesito saber el estado de un servicio al final de mi script por lotes que reinicia los servicios usando " net stop thingie " y " net start thingie " ;.

En mi mundo ideal favorito, me gustaría enviarme un correo electrónico al estado, leer en las noches frías de invierno, para tranquilizarme con la calidez y la comodidad de un servidor que sé que funciona correctamente.

Para que lo sepa, estoy usando una plataforma Windows Server 2003, y un archivo por lotes parece ser la mejor opción. No me importa usar otra cosa, y sería muy abierto a sugerencias, pero solo por el bien del conocimiento (como un zombi anhela cerebros, pensé, ¿por qué no inflar el mío), hay un comando que me permite verificar? ¿En el estado de un servicio, en la línea de comando?

¿Debo simplemente redirigir la salida del comando a un archivo?

¿Dónde diablos están mis pantalones? (Dios mío, realmente espero que el humor insertado en esto no insulte a nadie. Es miércoles por la mañana, y también necesito el humor: P)

[Editar:] La solución que usé está (ya no) disponible para descargar desde --link redacted--

Se utiliza como un conjunto de tareas que se ejecutará durante la noche, y al revisar mi correo electrónico por la mañana, veo si el servicio se ha reiniciado correctamente o no.

¿Fue útil?

Solución

Usando Windows Script:

Set ComputerObj = GetObject("WinNT://MYCOMPUTER")    
ComputerObj.Filter = Array("Service")    
For Each Service in ComputerObj    
    WScript.Echo "Service display name = " & Service.DisplayName    
    WScript.Echo "Service account name = " & Service.ServiceAccountName    
    WScript.Echo "Service executable   = " & Service.Path    
    WScript.Echo "Current status       = " & Service.Status    
Next

Puede filtrar fácilmente lo anterior para el servicio específico que desea.

Otros consejos

¿Has probado sc.exe ?

C:\> for /f "tokens=2*" %a in ('sc query audiosrv ^| findstr STATE') do echo %b
4  RUNNING

C:\> for /f "tokens=2*" %a in ('sc query sharedaccess ^| findstr STATE') do echo %b
1  STOPPED

Tenga en cuenta que dentro de un archivo por lotes duplicaría cada signo de porcentaje.

Puede llamar a net start " nombre del servicio " en su servicio. Si no está iniciado, lo iniciará y devolverá errorlevel = 0, si ya está iniciado, devolverá errorlevel = 2.

Utilizando pstools - en particular psservice y " consulta " - por ejemplo:

psservice query "serviceName"

mira también hier:

INICIO NETO | ENCONTRAR " Nombre del servicio " > nula    IF errorlevel 1 ECHO El servicio no se está ejecutando

acaba de copiar de: http://ss64.com/nt/sc.html

Si PowerShell está disponible para usted ...

Get-Service -DisplayName *Network* | ForEach-Object{Write-Host 

Si PowerShell está disponible para usted ...

Stopped : napagent
Stopped : NetDDE
Stopped : NetDDEdsdm
Running : Netman
Running : Nla
Stopped : WMPNetworkSvc
Stopped : xmlprov

Te dará ...

<*>

Puede reemplazar la **** Network **** con un nombre de servicio específico si solo necesita marcar un servicio.

.Status :

Si PowerShell está disponible para usted ...

<*>

Te dará ...

<*>

Puede reemplazar la **** Network **** con un nombre de servicio específico si solo necesita marcar un servicio.

.Name}

Te dará ...

<*>

Puede reemplazar la **** Network **** con un nombre de servicio específico si solo necesita marcar un servicio.

Tal vez esta podría ser la mejor manera de iniciar un servicio y verificar el resultado

Por supuesto, desde dentro de un Lote como File.BAT pone algo como este ejemplo, pero simplemente reemplaza " NameOfSercive " con el nombre de servicio que desee y reemplace las líneas REM con su propio código:

@ECHO OFF

REM Put whatever your Batch may do before trying to start the service

net start NameOfSercive 2>nul
if errorlevel 2 goto AlreadyRunning
if errorlevel 1 goto Error

REM Put Whatever you want in case Service was not running and start correctly

GOTO ContinueWithBatch

:AlreadyRunning
REM Put Whatever you want in case Service was already running
GOTO ContinueWithBatch

:Error
REM Put Whatever you want in case Service fail to start
GOTO ContinueWithBatch

:ContinueWithBatch

REM Put whatever else your Batch may do

Otra cosa es verificar su estado sin cambiarlo, para eso hay una manera mucho más simple de hacerlo, simplemente ejecuta:

net start

Por lo tanto, sin parámetros mostrará una lista con todos los servicios que se inician ...

Entonces, un simple grep o encontrarlo después en una tubería podría caber ...

Por supuesto, desde dentro de un Lote como File.BAT pone algo como este ejemplo, pero simplemente reemplaza " NameOfSercive " con el nombre de servicio que desee y reemplace las líneas REM con su propio código:

@ECHO OFF

REM Put here any code to be run before check for Service

SET TemporalFile=TemporalFile.TXT
NET START | FIND /N "NameOfSercive" > %TemporalFile%
SET CountLines=0
FOR /F %%X IN (%TemporalFile%) DO SET /A CountLines=1+CountLines
IF 0==%CountLines% GOTO ServiceIsNotRunning

REM Put here any code to be run if Service Is Running

GOTO ContinueWithBatch

:ServiceIsNotRunning

REM Put here any code to be run if Service Is Not Running

GOTO ContinueWithBatch
:ContinueWithBatch
DEL -P %TemporalFile% 2>nul
SET TemporalFile=

REM Put here any code to be run after check for Service

Espero que esto pueda ayudar !! Es lo que normalmente uso.

Bueno, veo "Nick Kavadias " diciendo esto:

  

" de acuerdo con este http://www.computerhope.com/nethlp.htm debería ser NET START / LIST ... "

Si escribe en Windows XP esto:

NET START /LIST

obtendrá un error, simplemente escriba en su lugar

NET START

La / LIST es solo para Windows 2000 ... Si lees completamente la web, verías que / LIST solo está en la sección de Windows 2000.

Espero que esto ayude !!!

mi intención era crear un script que activara y desactivara los servicios (en 1 script)

net start NameOfSercive 2>nul
if errorlevel 2 goto AlreadyRunning
if errorlevel 1 goto Error
     

...

¡¡Ayudé mucho !! TYVM z666

pero cuando, por ejemplo, el servicio está deshabilitado (también errorlevel = 2?) va a " AlreadyRuning " y nunca llega a

if errorlevel 1 goto Error  ?!!

Quería una salida para ese caso ...

 :AlreadyRunning
 net stop NameOfSercive
 if errorlevel 1 goto Error


 :Error
 Echo ERROR!!1!
 Pause

mis 2 centavos, espero que esto ayude

Bueno, no estoy seguro de si puede enviar por correo electrónico los resultados de un archivo por lotes. Si puedo hacer una sugerencia alternativa que resolvería su problema vbscript. No estoy muy bien con vbscript pero puede usarlo para consultar los servicios que se ejecutan en la máquina local. La siguiente secuencia de comandos le enviará por correo electrónico el estado de todos los servicios que se ejecutan en la máquina en la que se ejecuta la secuencia de comandos. Obviamente, querrá reemplazar el servidor smtp y la dirección de correo electrónico. Si forma parte de un dominio y ejecuta este script como un usuario privilegiado (deben ser un administrador en la máquina remota), también puede consultar máquinas remotas reemplazando localhost con el fqdn.

Dim objComputer, objMessage
Dim strEmail

' If there is an error getting the status of a service it will attempt to move on to the next one
On Error Resume Next

' Email Setup
Set objMessage = CreateObject("CDO.Message")
objMessage.Subject = "Service Status Report"
objMessage.From = "service_report@noreply.net"
objMessage.To = "youraddress@example.net"
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2

'Name or IP of Remote SMTP Server
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.example.net"

'Server port (typically 25)
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25

Set objComputer = GetObject("WinNT://localhost")
objComputer.Filter = Array("Service")

For Each aService In objComputer
strEmail = strEmail &chr(10) & aService.Name & "=" & aService.Status
Next

objMessage.TextBody = strEmail
objMessage.Configuration.Fields.Update
objMessage.Send

Espero que esto te ayude! ¡Disfruta!

Editar: Ahh, una cosa más: un estado de servicio de 4 significa que el servicio se está ejecutando, un estado de servicio de 1 significa que no lo está. No estoy seguro de lo que significa 2 o 3, pero estoy dispuesto a apostar que se están deteniendo / empezando.

de acuerdo con este http://www.computerhope.com/nethlp.htm Debería ser NET START / LIST pero no puedo hacer que funcione en el cuadro XP. Estoy seguro de que hay algunos WMI que te darán la lista.

Ros el código que publico también es para saber cuántos servicios se están ejecutando ...

Imagine que quiere saber cuántos servicios son como Oracle *, luego coloca Oracle en lugar de NameOfSercive ... y obtiene la cantidad de servicios como Oracle * ejecutándose en la variable% CountLines% y si desea hacer algo si solo hay 4 que puedes hacer algo como esto:

IF 4 ==% CountLines% GOTO FourServicesAreRunning

Eso es mucho más potente ... y su código no le permite saber si el servicio deseado se está ejecutando ... si hay otro elemento que comienza con el mismo nombre ... imagine: -Servicio a uno -ServiceOnePersonal

Si busca ServiceOne, pero solo ejecuta ServiceOnePersonal, su código le dirá que ServiceOne se está ejecutando ...

Mi código se puede cambiar fácilmente, ya que lee todas las líneas del archivo y lee línea por línea, también puede hacer lo que quiera con cada servicio ... vea esto:

@ECHO OFF
REM Put here any code to be run before check for Services

SET TemporalFile=TemporalFile.TXT
NET START > %TemporalFile%
SET CountLines=0
FOR /F "delims=" %%X IN (%TemporalFile%) DO SET /A CountLines=1+CountLines
SETLOCAL EnableDelayedExpansion
SET CountLine=0
FOR /F "delims=" %%X IN (%TemporalFile%) DO @(
 SET /A CountLine=1+CountLine

 REM Do whatever you want to each line here, remember first and last are special not service names

 IF 1==!CountLine! (

   REM Do whatever you want with special first line, not a service.

 ) ELSE IF %CountLines%==!CountLine! (

   REM Do whatever you want with special last line, not a service.

 ) ELSE (

   REM Do whatever you want with rest lines, for each service.
   REM    For example echo its position number and name:

   echo !CountLine! - %%X

   REM    Or filter by exact name (do not forget to not remove the three spaces at begining):
   IF "   NameOfService"=="%%X" (

     REM Do whatever you want with Service filtered.

   )
 )

 REM Do whatever more you want to all lines here, remember two first are special as last one

)

DEL -P %TemporalFile% 2>nul
SET TemporalFile=

REM Put here any code to be run after check for Services

Por supuesto, solo enumera los servicios en ejecución, no sé de qué manera net puede enumerar los servicios que no se ejecutan ...

Espero que esto ayude !!!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top