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"
- 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?
- 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?
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:
- interroge les propriétés du service.
- recherche la ligne contenant le texte "état"
- Tokenizes cette ligne, et sort de la 3ème partie, qui est l'une contenant l'état du service.
- 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.
pour basculer un service utiliser ce qui suit;
NET START" Distributed Transaction Coordinateur "/ / NET STOP " distribué Coordonnateur Des Transactions "
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.
Qui devrait le faire:
FOR %%a IN (%Svcs%) DO (SC query %%a | FIND /i "RUNNING"
IF ERRORLEVEL 1 SC start %%a)
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
)
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.
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.)
@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"
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.
)
)
)
)
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
}
}
@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
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