我想编写一个批处理文件,执行以下操作:
- 检查服务是否正在运行
- 如果正在运行,则退出批处理
- 如果没有运行,则启动服务
到目前为止,我搜索到的代码示例都不能正常工作,所以我决定不将它们发布。
启动服务可通过以下方式完成:
net start "SERVICENAME"
- 如何检查服务是否在运行,以及如何在批处理文件中进行if语句的编写?
- 我有点困惑。我需要传递到 net start 命令的参数是服务名称还是显示名称?
我想编写一个批处理文件,执行以下操作:
到目前为止,我搜索到的代码示例都不能正常工作,所以我决定不将它们发布。
启动服务可通过以下方式完成:
net start "SERVICENAME"
要检查服务的状态,请使用sc query <SERVICE_NAME>
。对于批处理文件中的if块,请查看文档。
以下代码将检查服务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"
)
)
它的作用解释如下:
至于您的第二个问题,您需要传递给 net start
的参数是服务名称,而不是显示名称。
sc query "SCardSvr"
时会发生什么? - lc.for /F "tokens=3 delims=: " %%H in ('sc query "MyServiceName"^|find /i "STATE"') do (
- Leptonatorsc.exe query "MyServiceName"
。因为 sc
是 Set-Content
的别名(您可以使用 Get-Alias "sc"
进行检查)。 - Henk PoleyNET START "Distributed Transaction Coordinator"(启动分布式事务协调器) || NET STOP "Distributed Transaction Coordinator"(停止分布式事务协调器)
||
实际上是一个 OR
运算符,尽管在这种情况下它在功能上是一个 ELSE
语句。这是一个微妙但重要的区别。我仍然给你点赞——我经常在 Unix/Linux shell 脚本中使用它,不知道为什么我从来没有想过在 Windows 批处理中这样做。 - Deaconsc query [ServiceName] | findstr /i "STATE"
当我在我的NOD32防病毒软件上运行它时,会得到:
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时,代码应该如下:
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
)
)
将 MYSERVICE 替换为要处理的服务名称。您可以通过查看服务属性来查看服务名称。
对于Windows Server 2012,以下是我使用的方法。仅用实际服务名称替换“SERVICENAME”:
@ECHO OFF
SET SvcName=SERVICENAME
SC QUERYEX "%SvcName%" | FIND "STATE" | FIND /v "RUNNING" > NUL && (
ECHO %SvcName% is not running
ECHO START %SvcName%
NET START "%SvcName%" > NUL || (
ECHO "%SvcName%" wont start
EXIT /B 1
)
ECHO "%SvcName%" is started
EXIT /B 0
) || (
ECHO "%SvcName%" is running
EXIT /B 0
)
@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"
$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
}
}