web-dev-qa-db-fra.com

Commande Windows pour obtenir l'état du service?

J'ai besoin de connaître le statut d'un service à la fin de mon script de traitement par lots, qui redémarre les services à l'aide de "net stop thingie" et "net start thingie".

Dans mon monde idéal préféré, j'aimerais envoyer un e-mail à l'État, lire pendant les nuits froides d'hiver, pour me rassurer avec la chaleur et le confort d'un serveur qui fonctionne correctement.

À titre d'information, j'utilise une plate-forme Windows Server 2003 et un fichier de commandes semblait être le meilleur choix. Cela ne me dérange pas d’utiliser quelque chose d’autre, et je serais très ouvert aux suggestions, mais pour des raisons de connaissance (comme un zombie a soif de cervelle, pensai-je, pourquoi ne pas gonfler le mien), existe-t-il une commande qui me permet sur le statut d'un service, en ligne de commande?

Devrais-je simplement rediriger la sortie de la commande vers un fichier?

Où diable sont mes pantalons? (Mon Dieu, j'espère vraiment que l'humour inséré ici n'insultera personne. Nous sommes mercredi matin et j'ai besoin de l'humour aussi: P)

[Edit:] La solution que j'ai utilisée est (n'est plus) disponible au téléchargement de --link redacted--

Il est utilisé comme un ensemble de tâches à exécuter pendant la nuit. En vérifiant mon courrier électronique le matin, je vois si le service a bien redémarré.

21
Olivier Tremblay

Utilisation de 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

Vous pouvez facilement filtrer ce qui précède pour le service spécifique que vous souhaitez.

5
MaSuGaNa

Avez-vous essayé 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

Notez que dans un fichier batch, vous doublez chaque signe de pourcentage.

26
Rômulo Ceccon

Vous pouvez appeler net start "service name" sur votre service. S'il n'est pas démarré, il le démarrera et retournera errorlevel = 0, s'il est déjà lancé, il retournera errorlevel = 2.

19
JRL

Utilisation de pstools - en particulier psservice et "query" - par exemple:

psservice query "serviceName"
12
Marc Gravell

regardez aussi hier:

DÉBUT NET | TROUVER "Nom du service"> nul SI errorlevel 1 ECHO Le service n'est pas en cours d'exécution

vient de copier: http://ss64.com/nt/sc.html

10
Ros

Si PowerShell est disponible pour vous ...

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

Te donnera...

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

Vous pouvez remplacer le réseau **** par un nom de service spécifique s'il vous suffit de vérifier un service.

9
aphoria

mon intention était de créer un script qui active et désactive les services (dans 1 script)

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

...

Beaucoup aidé !! TYVM z666

mais quand, par exemple le service est désactivé (également errorlevel = 2?), il passe à "déjà en cours" et ne vient jamais à

if errorlevel 1 goto Error  ?!!

je voulais une sortie pour ce cas ...

 :AlreadyRunning
 net stop NameOfSercive
 if errorlevel 1 goto Error


 :Error
 Echo ERROR!!1!
 Pause

mes 2 cents, espérons que cela aide

2
xy77

Eh bien, je vois "Nick Kavadias" raconter ceci:

"Selon ce http://www.computerhope.com/nethlp.htm cela devrait être NET START/LIST ..."

Si vous tapez sous Windows XP, ceci:

NET START /LIST

vous obtiendrez une erreur, tapez simplement 

NET START

Le/LIST est uniquement destiné à Windows 2000 ... Si vous lisez intégralement ce site Web, vous verrez que le/LIST concerne uniquement la section Windows 2000.

J'espère que cela t'aides!!!

2
z666zz666z

Peut-être que cela pourrait être la meilleure façon de démarrer un service et de vérifier le résultat

Bien sûr, à l'intérieur d'un lot comme File.BAT, mettez quelque chose comme cet exemple, mais remplacez simplement "NameOfSercive" par le nom du service souhaité et remplacez les lignes REM par votre propre code:

@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

Une autre chose est de vérifier son état sans le changer, car il existe un moyen beaucoup plus simple de le faire, il suffit de lancer:

net start

En tant que cela, sans paramètres, il affichera une liste de tous les services démarrés ... 

Donc, un simple grep ou trouver après sur un tuyau conviendrait ... 

Bien sûr, à l'intérieur d'un lot comme File.BAT, mettez quelque chose comme cet exemple, mais remplacez simplement "NameOfSercive" par le nom du service souhaité et remplacez les lignes REM par votre propre code:

@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

J'espère que cela peut aider! C'est ce que j'utilise normalement.

2
z666zz666z

Eh bien, je ne sais pas si vous pouvez envoyer par courrier électronique les résultats à partir d’un fichier de commandes. Si je peux me permettre de faire une autre suggestion qui résoudrait votre problème, vbscript. Je suis loin d'être formidable avec vbscript mais vous pouvez l'utiliser pour interroger les services en cours d'exécution sur la machine locale. Le script ci-dessous vous enverra par e-mail le statut de tous les services en cours d'exécution sur la machine sur laquelle le script est exécuté. Vous voudrez évidemment remplacer le serveur smtp et l'adresse email. Si vous faites partie d'un domaine et que vous exécutez ce script en tant qu'utilisateur privilégié (il doit être administrateur de la machine distante), vous pouvez également interroger des machines distantes en remplaçant localhost par 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 = "[email protected]"
objMessage.To = "[email protected]"
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

J'espère que cela vous aide! Prendre plaisir!

Edit: Ah encore une chose, un statut de service de 4 signifie que le service est en cours d’exécution, un statut de service de 1 signifie que ce n’est pas le cas. Je ne suis pas sûr de ce que 2 ou 3 signifie mais je suis prêt à parier qu'ils s'arrêtent/commencent.

1
Sam Stelfox

Ros le code que je poste est également pour savoir combien de services sont en cours d'exécution ...

Imaginez que vous vouliez savoir combien de services ressemblent à Oracle *, puis vous mettez Oracle au lieu de NameOfSercive ... et vous obtenez le nombre de services comme Oracle * s'exécutant sur la variable% CountLines% et si vous voulez faire quelque chose s'il n'y a 4 vous pouvez faire quelque chose comme ceci:

IF 4 ==% CountLines% GOTO FourServicesAreRunning

C’est beaucoup plus puissant ... et votre code ne vous permet pas de savoir si le service souhaité est actif ... s’il existe un autre compte commençant par le même nom ... imaginez: - ServiceOne - ServiceOnePersonal

Si vous recherchez ServiceOne, mais uniquement ServiceOnePersonal, votre code indiquera que ServiceOne est en cours d'exécution ...

Mon code peut être facilement changé, car il lit toutes les lignes du fichier et lit ligne par ligne, il peut également faire ce que vous voulez pour chaque service ... voyez ceci:

@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

Bien sûr, il ne liste que les services en cours d'exécution, je ne sais pas comment le réseau peut lister les services en cours d'exécution ...

J'espère que cela t'aides!!!

0
z666zz666z

selon cette http://www.computerhope.com/nethlp.htm cela devrait être NET START/LIST mais je ne peux pas le faire fonctionner avec la boîte XP. Je suis sûr qu'il y a un WMI qui vous donnera la liste.

0
Nick Kavadias