如何检查服务是否正在通过batch file运行,并启动它,如果它没有运行?
我想写一个batch file,执行以下操作:
- 检查服务是否正在运行
- 如果正在运行,请退出批处理
- 如果没有运行,请启动该服务
我search到的代码样本到目前为止没有工作,所以我决定不发布它们。
开始一项服务是由:
net start "SERVICENAME"
- 如何检查服务是否正在运行,以及如何在batch file中创buildif语句?
- 我有点困惑。 我必须通过networking开始的论点是什么? 服务名称或其显示名称?
要检查服务的状态,请使用sc query <SERVICE_NAME>
。 对于batch file中的块, 请检查文档 。
下面的代码将检查服务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" ) )
它做什么的解释:
- 查询服务的属性。
- 查找包含文字“STATE”的行
- 标记这条线,并且拉出第三个标记,它是包含服务状态的标记。
- 根据string“RUNNING”testing结果状态
至于你的第二个问题,你将要传递给net start
是服务名称, 而不是显示名称。
要切换服务,请使用以下内容;
NET START“分布式事务处理协调器”|| NET STOP“分布式事务处理协调器”
您可以使用以下命令查看服务是否正在运行:
sc query [ServiceName] | findstr /i "STATE"
当我运行它为我的NOD32 Antivirus,我得到:
STATE : 4 RUNNING
如果停止,我会得到:
STATE : 1 STOPPED
你可以在一个variables中使用它来决定你是否使用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,在西class牙语中使用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。 (将MYSERVICEreplace为要处理的服务的名称,您可以在服务属性中看到该服务的名称。)
我只是发现这个线程,并希望添加到讨论如果该人不想使用batch file来重新启动服务。 在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,但还有其他的命令行选项如何从Windowsbatch file发送简单的电子邮件?
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脚本启动服务。 您可以将其链接到任务计划程序并按需要间隔或触发它。 创build这个PS1文件,即扩展名为PS1的文件,然后让这个文件从任务调度器中被触发。
开始停止服务
在任务调度程序中,如果您在服务器上使用它,请在参数中使用它
-noprofile -executionpolicy bypass -file“C:\ Service Restart Scripts \ StopService.PS1”
通过在cmd上运行相同的validation,如果它工作,它也应该在任务调度器上工作
$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