如何检查服务是否正在通过batch file运行,并启动它,如果它没有运行?

我想写一个batch file,执行以下操作:

  • 检查服务是否正在运行
    • 如果正在运行,请退出批处理
    • 如果没有运行,请启动服务

我search到的代码样本到目前为止没有工作,所以我决定不发布它们。

开始一项服务是由:

net start "SERVICENAME" 
  1. 如何检查服务是否正在运行,以及如何在batch file中创buildif语句?
  2. 我有点困惑。 我必须通过networking开始的论点是什么? 服务名称或其显示名称?

Solutions Collecting From Web of "如何检查服务是否正在通过batch file运行,并启动它,如果它没有运行?"

要检查服务的状态,请使用sc query <SERVICE_NAME> 对于批处理文件中的块, 请检查文档 。

下面的代码将检查服务MyServiceName的状态,如果它没有运行,则启动它(如果服务未运行,将执行if块):

 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" ) ) 

它做什么的解释:

  1. 查询服务的属性。
  2. 查找包含文字“STATE”的行
  3. 标记这条线,并且拉出第三个标记,它是包含服务状态的标记。
  4. 根据字符串“RUNNING”测试结果状态

至于你的第二个问题,你将要传递给net start是服务名称, 而不是显示名称。

要切换服务,请使用以下内容;

NET START“分布式事务处理协调器”|| NET STOP“分布式事务处理协调器”

您可以使用以下命令查看服务是否正在运行:

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

当我运行它为我的NOD32 Antivirus,我得到:

 STATE : 4 RUNNING 

如果停止,我会得到:

 STATE : 1 STOPPED 

你可以在一个变量中使用它来决定你是否使用NET START。

服务名称应该是服务名称,而不是显示名称。

这应该做到这一点:

 FOR %%a IN (%Svcs%) DO (SC query %%a | FIND /i "RUNNING" IF ERRORLEVEL 1 SC start %%a) 

语言独立版本。

 @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 ) 

在Windows上使用Windows,如果使用西班牙语Windows,代码是:

 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。 (将MYSERVICE替换为要处理的服务的名称,您可以在服务属性中看到该服务的名称。)

我只是发现这个线程,并希望添加到讨论如果该人不想使用批处理文件来重新启动服务。 在Windows中,如果转到服务,服务属性,然后恢复,则有一个选项。 在这里你可以设置服务的参数。 喜欢重新启动服务,如果服务停止。 此外,你甚至可以有第二次失败尝试做一些不同的事情,在重新启动计算机。

 @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" 

我也想要一个电子邮件发送,如果服务是以这种方式开始,所以加了一点@Ic代码只是想我会张贴,以防万一它帮助任何人。 我使用SendMail,但还有其他的命令行选项如何从Windows批处理文件发送简单的电子邮件?

 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. ) ) ) ) 

使用Powershell脚本启动服务。 您可以将其链接到任务计划程序并按需要间隔或触发它。 创建这个PS1文件,即扩展名为PS1的文件,然后让这个文件从任务调度器中被触发。

开始停止服务

在任务调度程序中,如果您在服务器上使用它,请在参数中使用它

-noprofile -executionpolicy bypass -file“C:\ Service Restart Scripts \ StopService.PS1”

通过在cmd上运行相同的验证,如果它工作,它也应该在任务调度器上工作

 $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