2010-07-24 65 views
71

我想写执行以下操作的批处理文件:如何通过批处理文件检查服务是否正在运行并启动它(如果未运行)?

  • 检查服务是否运行
    • 如果它运行,退出批量
    • 如果它没有运行,启动服务

的代码示例我一派到目前为止竟然不能用了,所以我决定不婆st他们。

启动的服务是通过做:

net start "SERVICENAME" 
  1. 如何检查服务是否运行,以及如何使一个if语句在批处理文件?
  2. 我有点困惑。我必须通过网络开始的论点是什么?服务名称或其显示名称?
+2

dirty编程:当你想要做的唯一一件事就是启动服务如果没有运行,只需发出启动命令。如果它没有运行,它将启动服务。如果它正在运行而不是您收到错误消息,但该服务正在运行(并且不停止)。脏,但它的作品。但是,只有在您必须启动服务时才需要执行其他注释,那么请确保使用lc的清洁版本。 – 2012-03-08 18:05:06

+0

@Peter Schuetze:是的,如果开始服务是唯一的目的,你的反对是正确的。我还包括记录开始等等,所以我坚持lc的解决方案。 – citronas 2012-03-09 13:18:47

回答

123

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

下面的代码将检查服务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. 将该行标记,并取出包含服务状态的第3个标记。
  4. 测试对字符串“RUNNING”

关于你的第二个问题产生的状态中,你会想传递给net start参数是服务名称,显示名称。

+0

太棒了。谢谢你的努力。不幸的是它不起作用?也许我太愚蠢了。我将“MyServiceName”替换为“SCardSvr”(转义)作为测试,将所有内容都放入批处理文件中,执行它,但服务不启动。即使我将net start替换为其他文件,如打印到文件中,也不会执行。你介意请再看一下吗? =) – citronas 2010-07-24 13:07:44

+0

哎呀我在第一行有一些额外的东西...试试这个。如果它不起作用,当你从命令行运行sc查询“SCardSvr”时会发生什么? – 2010-07-24 13:21:59

+1

你有引号中的“SCardSvr”吗?我不相信它应该是, – LittleBobbyTables 2010-07-24 13:22:14

12

应该这样做:

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

您可以使用下面的命令来查看服务是否运行与否:

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

当我运行它为我的NOD32防病毒软件,我得到:

STATE      : 4 RUNNING 

如果它停止,我会得到:

STATE      : 1 STOPPED 

您可以在变量中使用此值,然后确定是否使用NET START。

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

+1

感谢您的帮助,在尝试整合您发布的内容时,我大大提高了我的批处理技能;) – citronas 2010-07-24 13:39:19

27

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

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

+1

它起作用是因为退出代码从开始。如果启动命令失败,可能是因为它已经在运行(并且随后以任何方式停止它都不会受到伤害),所以你试着停止它。 – 2012-03-27 15:34:16

+3

该命令的结构是这样的,如果网络启动失败,它会停止它(由于||这意味着其他),但如果网络启动运行,则净停止不执行。辉煌! – 2012-05-18 15:35:12

+0

在编程中经常使用的非常简单的技巧! – Birla 2014-08-06 04:55:33

4

宽多SE使用Windows的西班牙语,ELcódigo德贝quedar ASI(在西班牙语中使用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农布雷德尔SERVICIO阙本身desea procesar。 Puedes ver el nombre del servicio viendo las propiedades del servicio。 (与服务的名称替换MYSERVICE进行处理。你可以看到服务属性的服务的名称。)

+8

如果你用英文写你的答案,对每个人来说都会更好。 – j0k 2012-09-03 12:34:29

+1

不知道为什么downvote。如果可能的话,这是一个重要的点和避免字符串比较的理由。在这种情况下,您必须根据目标Windows安装的默认语言更改字符串。 – 2012-09-13 07:50:20

+2

@lc:为每种语言包含答案是否合理?引用(或包含)一个资源,说明要搜索给定语言的字符串可能更有用。 – 2013-06-28 18:25:14

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

我也想发送的电子邮件,如果该服务已启动这种方式使平添了几分以@Ic代码只是想我会张贴它,以防万一它帮助任何人。我用的SendMail但也有其他的命令行选项How to send a simple email from a Windows batch 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 [email protected] /from [email protected] /subject Service Autostart Notification /body Autostart on service %service% succeded. 
    ) else (
     SendMail /smtpserver localhost /to [email protected] /from [email protected] /subject Service Autostart Notification /body Autostart on service %service% failed. 
    ) 
    ) 

) 
) 
5

我刚刚发现这个线索,并希望加入到讨论中,如果人不希望使用批处理文件重新启动服务。在Windows中,如果转到服务,服务属性和恢复,则会有一个选项。在这里你可以设置服务的参数。喜欢在服务停止时重新启动服务。此外,你甚至可以尝试第二次尝试做一些与重新启动计算机不同的尝试。

+2

这是一个有用的答案,但重要的是要注意,这将只在服务停止并退出(-1)时才起作用。如果服务正常退出(即使出现错误消息),自动恢复也不会触发。如果服务被用户手动终止,它也不会触发。 – 2016-01-06 09:22:19

9

与语言无关的版本。

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

是的! “太空”总是突然袭击你的背部! – 2016-01-08 16:07:31

+0

几乎完美的答案。我只是修复了这一行: 网络启动“%ServiceName%”> nul ||( – Cesar 2017-01-24 23:16:46

+0

我已经使脚本具有通用性,所以它允许我在Windows调度程序任务中使用,只需将Set ServiceName = Jenkins替换为'Set ServiceName =%〜1'并将其命名为'watch-service.bat'Jenkins'' – 2017-01-31 07:30:37

0
@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 
1

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

要任务调度启动一站式服务

如果你使用的是它在服务器上使用此参数中

-noprofile -ExecutionPolicy旁路-file“C:\服务重新启动脚本\ 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 
} 
} 
相关问题