Pergunta

Eu preciso saber o status de um serviço no final do meu script em lotes que reinicia serviços usando "thingie net stop" e "thingie net start".

No meu mundo ideal mais favorito, eu gostaria de e-mail do estado para mim mesmo, para ler nas noites frias de Inverno, para me tranquilizar com o calor eo conforto de um servidor que eu sei que está funcionando direito.

Só para você saber, eu estou usando uma plataforma de servidor Windows 2003, e um arquivo de lote parecia ser a melhor escolha. Eu não me importo com qualquer outra coisa, e seria muito aberto a sugestões, mas apenas por uma questão de conhecimento (como um zumbi implora cérebros, eu pensei, por que não inflar meu próprio), existe um comando que me permite verificar sobre o estado de um serviço, na linha de comando?

Eu deveria redirecionar a saída do comando para um arquivo?

Onde diabos estão minhas calças? (Puxa, eu realmente espero que o humor inserido neste não vai insultar ninguém é quarta-feira de manhã, e humor eu preciso muito:. P)

[Edit:] A solução que eu usei é (não) disponível para download a partir --link redigido -

É usado como um conjunto de tarefas a serem executadas durante a noite, e verificar meu e-mail na parte da manhã, eu ver se ou não o serviço corretamente reiniciado.

Foi útil?

Solução

Usando o 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

Você pode facilmente filtrar o acima para o serviço específico que você deseja.

Outras dicas

Você já tentou 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

Note-se que dentro de um arquivo de lote que você dobrar cada signo por cento.

Você pode chamar net start "service name" em seu serviço. Se não for iniciado, ele vai começar a ele e regresso errorlevel = 0, se ele já começou ele vai voltar errorlevel = 2.

Usando pstools - em particular, PsService e "consulta" - por exemplo:

psservice query "serviceName"

olhar também hier:

NET START | ENCONTRAR "Nome do serviço"> nul Se errorlevel 1 ECHO O serviço não está em execução

acabou de copiar a partir de: http://ss64.com/nt/sc.html

Se PowerShell está disponível para você ...

Get-Service -DisplayName *Network* | ForEach-Object{Write-Host $_.Status : $_.Name}

Vamos dar-lhe ...

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

Você pode substituir o **** de rede **** com um nome de serviço específico se você só precisa verificar um serviço.

Talvez esta poderia ser a melhor maneira de começar um serviço e verificar o resultado

É claro que de dentro de um lote como FILE.BAT colocar algo como este exemplo, mas apenas substituir "NameOfSercive" com o nome do serviço que você quer e substituir as linhas REM com seu próprio 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

Outra coisa é verificar o seu estado sem alterá-lo, por que não há uma maneira muito mais simples de fazê-lo, basta executar:

net start

Como que, sem parâmetros ele irá mostrar uma lista com todos os serviços que são iniciados ...

Assim, um simples grep ou encontrar depois em uma tubulação caberia ...

É claro que de dentro de um lote como FILE.BAT colocar algo como este exemplo, mas apenas substituir "NameOfSercive" com o nome do serviço que você quer e substituir as linhas REM com seu próprio 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 isso pode ajudar !! É o que eu uso normalmente.

Bem, eu ver "Nick Kavadias" dizendo o seguinte:

"de acordo com esta http://www.computerhope.com/nethlp.htm -lo deve ser NET START / LISTA ... "

Se você digitar no Windows XP isto:

NET START /LIST

Você receberá um erro, basta digitar em vez

NET START

A / LIST é apenas para Windows 2000 ... Se você ler totalmente tais web você veria o / LIST é apenas na secção Windows 2000.

Espero que isso ajude !!!

minha intenção era criar um script que alterna serviços ON e OFF (em 1 de script)

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

...

Ajudou !! Tyvm z666

mas quando por exemplo serviço for desativado (também errorlevel = 2?) ele vai para "AlreadyRuning" e nunca chega a

if errorlevel 1 goto Error  ?!!

i queria uma saída para esse caso ...

 :AlreadyRunning
 net stop NameOfSercive
 if errorlevel 1 goto Error


 :Error
 Echo ERROR!!1!
 Pause

meus 2 centavos, espero que isso ajude

Bem, eu não tenho certeza sobre se você pode enviar e-mail os resultados de que a partir de um arquivo de lote. Se eu puder fazer uma sugestão alternativa que iria resolver o seu VBScript problema. Estou longe de ser grande com o VBScript, mas você pode usá-lo para consultar os serviços em execução na máquina local. O script abaixo lhe enviaremos o status de todos os serviços em execução na máquina o script é executado no. Você obviamente quer substituir o servidor SMTP e o endereço de email. Se você faz parte de um domínio e você executar este script como um usuário privilegiado (eles têm que ser um administrador na máquina remota) você pode consultar máquinas remotas, assim, substituindo localhost com o 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 isso ajude você! Divirta-se!

Edit: Ahh mais uma coisa um status de 4 significa que o serviço está sendo executado um serviço, um status de 1 significa serviço não é. Não estou certo do que 2 ou 3 meios, mas eu estou disposto a apostar que eles estão parando / partida.

de acordo com esta http://www.computerhope.com/nethlp.htm -lo deve ser NET START / LIST mas eu não posso obtê-lo para trabalhar em pela caixa XP. Eu tenho certeza que há alguns WMI que lhe dará a lista.

Ros o código i postar também é para saber quantos serviços estão sendo executados ...

Imagine que você quer saber quantos serviços são como a Oracle * então você coloca a Oracle em vez de NameOfSercive ... e você terá o número de serviços como Oracle * correndo na variável% CountLines% e se você quiser fazer algo se há apenas 4 você pode fazer algo como isto:

SE 4 ==% CountLines% GOTO FourServicesAreRunning

Isso é muito mais poderoso ... e seu código não permite saber se o serviço desejado está sendo executado ... se houver outra partida srecive com mesmo nome ... imagine: -ServiceOne -ServiceOnePersonal

Se você procurar ServiceOne, mas é só correr ServiceOnePersonal seu código irá dizer ServiceOne está funcionando ...

Meu código pode ser easly mudou, já que ele lê todas as linhas do arquivo e linha de leitura por linha também pode fazer o que quiser para cada serviço ... veja isto:

@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

É claro que ele só lista de execução serviços, eu não sei alguma forma líquida pode listar não executar serviços ...

Espero que isso ajude !!!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top