Comment vérifier si un service est en cours d'exécution via un fichier batch et le démarrer, s'il ne l'est pas?

je veux écrire un fichier par lot qui effectue les opérations suivantes:

  • vérifier si un service est en cours d'exécution
    • si elle est en cours d'exécution, quitter le lot
    • s'il ne tourne pas, démarrer le service

les échantillons de code que j'ai googlés jusqu'à présent se sont avérés ne pas fonctionner, donc j'ai décidé de ne pas les poster.

démarrage d'un service est fait par:

net start "SERVICENAME"
  1. Comment puis-je vérifier si un service est en cours d'exécution, et comment faire une déclaration si dans un fichier batch?
  2. je suis un peu confus. Quel est l'argument que je dois passer sur le net start? Le nom du service ou son nom d'affichage?
76
demandé sur citronas 2010-07-24 16:28:44

12 réponses

pour vérifier l'état d'un service, utilisez sc query <SERVICE_NAME> . Pour les blocs if dans les fichiers de lots, vérifier la documentation .

le code suivant vérifiera l'état du service MyServiceName et le démarrera s'il n'est pas en cours d'exécution (le bloc SI sera exécuté si le service n'est pas en cours d'exécution):

for /F "tokens=3 delims=: " %%H in ('sc query "MyServiceName" ^| findstr "        STATE"') do (
  if /I "%%H" NEQ "RUNNING" (
   REM Put your code you want to execute here
   REM For example, the following line
   net start "MyServiceName"
  )
)

explication de ce qu'il fait:

  1. interroge les propriétés du service.
  2. recherche la ligne contenant le texte "état"
  3. Tokenizes cette ligne, et sort de la 3ème partie, qui est l'une contenant l'état du service.
  4. teste l'état résultant contre la chaîne "RUNNING"

quant à votre deuxième question, l'argument que vous voulez passer à net start est le nom de service, pas le nom d'affichage.

136
répondu lc. 2010-07-24 13:20:24

pour basculer un service utiliser ce qui suit;

NET START" Distributed Transaction Coordinateur "/ / NET STOP " distribué Coordonnateur Des Transactions "

27
répondu Coops 2017-01-03 08:40:12

Vous pouvez utiliser la commande suivante pour voir si un service est en cours d'exécution ou non:

sc query [ServiceName] | findstr /i "STATE"

quand je l'exécute Pour Mon Antivirus NOD32, je reçois:

STATE                       : 4 RUNNING

si on l'arrêtait, j'obtiendrais:

STATE                       : 1 STOPPED

vous pouvez utiliser cette variable pour déterminer si vous utilisez NET START ou non.

le nom du service doit être le nom du service, et non le nom de l'affichage.

18
répondu LittleBobbyTables 2010-07-24 12:36:00

Qui devrait le faire:

FOR %%a IN (%Svcs%) DO (SC query %%a | FIND /i "RUNNING"
IF ERRORLEVEL 1 SC start %%a)
13
répondu Kristina Brooks 2010-07-24 12:34:57

indépendante de la Langue de la version.

@Echo Off
Set ServiceName=Jenkins


SC queryex "%ServiceName%"|Find "STATE"|Find /v "RUNNING">Nul&&(
    echo %ServiceName% not running 
    echo Start %ServiceName%

    Net start "%ServiceName%">nul||(
        Echo "%ServiceName%" wont start 
        exit /b 1
    )
    echo "%ServiceName%" started
    exit /b 0
)||(
    echo "%ServiceName%" working
    exit /b 0
)
10
répondu Dr.eel 2017-04-11 17:35:56

je viens de trouver ce thread et je voulais ajouter à la discussion si la personne ne veut pas utiliser un fichier batch pour redémarrer les services. Dans Windows il y a une option si vous allez aux Services, aux propriétés de service, puis à la récupération. Ici, vous pouvez définir les paramètres du service. Comme pour redémarrer le service si le service s'arrête. En outre, vous pouvez même avoir une deuxième tentative d'échec faire quelque chose de différent comme dans redémarrer l'ordinateur.

5
répondu sagelightning 2013-04-10 15:56:14

Cuando se utiliser Windows en Español, el código debe quedar asi (lors de l'utilisation de Windows en espagnol, le code est):

for /F "tokens=3 delims=: " %%H in ('sc query MYSERVICE ^| findstr "        ESTADO"') do (
  if /I "%%H" NEQ "RUNNING" (
    REM Put your code you want to execute here
    REM For example, the following line
    net start MYSERVICE
  )
)

Reemplazar MYSERVICE con el nombre del servicio que se desea procesar. Puedes ver el nombre del servicio viendo las propiedades del servicio. (Remplacer MYSERVICE par le nom du service à traiter. Vous pouvez voir le nom du service sur les propriétés du service.)

4
répondu Daniel Serrano 2012-10-02 14:22:30
@echo off

color 1F


@sc query >%COMPUTERNAME%_START.TXT


find /I "AcPrfMgrSvc" %COMPUTERNAME%_START.TXT >nul

IF ERRORLEVEL 0 EXIT

IF ERRORLEVEL 1 NET START "AcPrfMgrSvc"
2
répondu Logan78 2012-11-02 23:38:54

je voulais aussi un e-mail envoyé si le service a été lancé de cette façon donc ajouté un peu au code @Ic juste pensé que je le posterais au cas où il aurait aidé n'importe qui. J'ai utilisé SendMail mais il y a d'autres options de ligne de commande Comment envoyer un simple e-mail à partir d'un fichier Windows batch?

set service=MyServiceName

for /F "tokens=3 delims=: " %%H in ('sc query %service% ^| findstr "        STATE"') do (
  if /I "%%H" NEQ "RUNNING" (

    net start %service%

    for /F "tokens=3 delims=: " %%H in ('sc query %service% ^| findstr "        STATE"') do (
      if /I "%%H" EQ "RUNNING" (
        SendMail /smtpserver localhost /to me@mydomain.com /from watchdog@mydomain.com /subject Service Autostart Notification /body Autostart on service %service% succeded.
      ) else (
        SendMail /smtpserver localhost /to me@mydomain.com /from watchdog@mydomain.com /subject Service Autostart Notification /body Autostart on service %service% failed.
      )
    )

  )
)
1
répondu BYoung 2017-05-23 12:26:33

Démarrage de Service à l'aide d'un script Powershell. Vous pouvez lier ceci au planificateur de tâche et le déclencher à intervalles ou si nécessaire. Créer ce fichier en tant que fichier PS1, c'est-à-dire fichier avec extension PS1, puis laisser ce fichier être déclenché à partir de la tâche scheduler.

pour commencer À arrêter le service

dans le planificateur de tâches si vous l'utilisez sur le serveur utilisez ceci dans les arguments

- noprofile-executionpolicy bypass-file " C:\Service redémarrage Scripts\StopService.PS1 "

vérifier en exécutant le même sur cmd si cela fonctionne, il doit travailler sur le planificateur de tâches aussi

$Password = "Enter_Your_Password"
$UserAccount = "Enter_Your_AccountInfor"
$MachineName = "Enter_Your_Machine_Name"
$ServiceList = @("test.SocketService","test.WcfServices","testDesktopService","testService")
$PasswordSecure = $Password | ConvertTo-SecureString -AsPlainText -Force
$Credential = new-object -typename System.Management.Automation.PSCredential -argumentlist $UserAccount, $PasswordSecure 

$LogStartTime = Get-Date -Format "MM-dd-yyyy hh:mm:ss tt"
$FileDateTimeStamp = Get-Date -Format "MM-dd-yyyy_hh"
$LogFileName = "C:\Users\krakhil\Desktop\Powershell\Logs\StartService_$FileDateTimeStamp.txt" 


#code to start the service

"`n####################################################################" > $LogFileName
"####################################################################" >> $LogFileName
"######################  STARTING SERVICE  ##########################" >> $LogFileName

for($i=0;$i -le 3; $i++)
{
"`n`n" >> $LogFileName
$ServiceName = $ServiceList[$i]
"$LogStartTime => Service Name: $ServiceName" >> $LogFileName

Write-Output "`n####################################"
Write-Output "Starting Service - " $ServiceList[$i]

"$LogStartTime => Starting Service: $ServiceName" >> $LogFileName
Start-Service $ServiceList[$i]

$ServiceState = Get-Service | Where-Object {$_.Name -eq $ServiceList[$i]}

if($ServiceState.Status -eq "Running")
{
"$LogStartTime => Started Service Successfully: $ServiceName" >> $LogFileName
Write-Host "`n Service " $ServiceList[$i] " Started Successfully"
}
else
{
"$LogStartTime => Unable to Stop Service: $ServiceName" >> $LogFileName
Write-Output "`n Service didn't Start. Current State is - "
Write-Host $ServiceState.Status
}
}

#code to stop the service

"`n####################################################################" > $LogFileName
"####################################################################" >> $LogFileName
"######################  STOPPING SERVICE  ##########################" >> $LogFileName

for($i=0;$i -le 3; $i++)
{
"`n`n" >> $LogFileName
$ServiceName = $ServiceList[$i]
"$LogStartTime => Service Name: $ServiceName" >> $LogFileName

Write-Output "`n####################################"
Write-Output "Stopping Service - " $ServiceList[$i]

"$LogStartTime => Stopping Service: $ServiceName" >> $LogFileName
Stop-Service $ServiceList[$i]

$ServiceState = Get-Service | Where-Object {$_.Name -eq $ServiceList[$i]}

if($ServiceState.Status -eq "Stopped")
{
"$LogStartTime => Stopped Service Successfully: $ServiceName" >> $LogFileName
Write-Host "`n Service " $ServiceList[$i] " Stopped Successfully"
}
else
{
"$LogStartTime => Unable to Stop Service: $ServiceName" >> $LogFileName
Write-Output "`nService didn't Stop. Current State is - "
Write-Host $ServiceState.Status
}
}
1
répondu KR Akhil 2017-11-08 14:12:34
@Echo off

Set ServiceName=wampapache64

SC queryex "%ServiceName%"|Find "STATE"|Find /v "RUNNING">Nul&&(

echo %ServiceName% not running
echo  

Net start "%ServiceName%"


    SC queryex "%ServiceName%"|Find "STATE"|Find /v "RUNNING">Nul&&(
        Echo "%ServiceName%" wont start
    )
        echo "%ServiceName%" started

)||(
    echo "%ServiceName%" was working and stopping
    echo  

    Net stop "%ServiceName%"

)


pause
0
répondu Aylian Craspa 2017-01-12 06:56:26

en lien avec la réponse de @DanielSerrano, j'ai été récemment mordu par la localisation de la commande sc.exe , à savoir en espagnol. Ma proposition est de pointer la ligne et le jeton qui tient l'état de service numérique et de l'interpréter, qui devrait être beaucoup plus robuste:

@echo off

rem TODO: change to the desired service name
set TARGET_SERVICE=w32time

set SERVICE_STATE=
rem Surgically target third line, as some locales (such as Spanish) translated the utility's output
for /F "skip=3 tokens=3" %%i in ('""%windir%\system32\sc.exe" query "%TARGET_SERVICE%" 2>nul"') do (
  if not defined SERVICE_STATE set SERVICE_STATE=%%i
)
rem Process result
if not defined SERVICE_STATE (
  echo ERROR: could not obtain service state!
) else (
  rem NOTE: values correspond to "SERVICE_STATUS.dwCurrentState"
  rem https://msdn.microsoft.com/en-us/library/windows/desktop/ms685996(v=vs.85).aspx
  if not %SERVICE_STATE%==4 (
    echo WARNING: service is not running
    rem TODO: perform desired operation
    rem net start "%TARGET_SERVICE%"
  ) else (
    echo INFORMATION: service is running
  )
)

Testé avec:

  • Windows XP (32 bits) anglais
  • Windows 10 (32 bits) Espagnol
  • Windows 10 (64 bits) anglais
0
répondu Helder Magalhães 2018-06-22 11:47:25