Windows 如何通过批处理文件检查服务是否正在运行,并在服务未运行时启动它?

Windows 如何通过批处理文件检查服务是否正在运行,并在服务未运行时启动它?,windows,windows-services,batch-file,scheduled-tasks,Windows,Windows Services,Batch File,Scheduled Tasks,我想编写一个执行以下操作的批处理文件: 检查服务是否正在运行 如果正在运行,请退出批处理 如果未运行,请启动该服务 到目前为止,我在谷歌上搜索的代码示例结果不起作用,所以我决定不发布它们 通过以下方式启动服务: net start "SERVICENAME" 如何检查服务是否正在运行,以及如何在批处理文件中生成if语句 我有点困惑。什么是我必须传递到净开始的论点?服务名称或其显示名称 这应该做到: FOR %%a IN (%Svcs%) DO (SC query %%a | FIND

我想编写一个执行以下操作的批处理文件:

  • 检查服务是否正在运行
    • 如果正在运行,请退出批处理
    • 如果未运行,请启动该服务
到目前为止,我在谷歌上搜索的代码示例结果不起作用,所以我决定不发布它们

通过以下方式启动服务:

net start "SERVICENAME"
  • 如何检查服务是否正在运行,以及如何在批处理文件中生成if语句
  • 我有点困惑。什么是我必须传递到净开始的论点?服务名称或其显示名称
  • 这应该做到:

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

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

    sc query [ServiceName] | findstr /i "STATE"
    
    当我运行NOD32防病毒软件时,我得到:

    STATE                       : 4 RUNNING
    
    如果停止,我会得到:

    STATE                       : 1 STOPPED
    
    您可以在变量中使用它,然后确定是否使用NET START


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

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

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

    解释其作用:

  • 查询服务的属性
  • 查找包含文本“STATE”的行
  • 标记该行,并提取第三个标记,即包含服务状态的标记
  • 根据字符串“RUNNING”测试结果状态

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

    要切换服务,请使用以下参数:

    “网络启动”分布式事务 协调员“| |净站”已分发 交易协调员“


    Cuando se使用西班牙文Windows,el código debe quedar asi(使用西班牙文Windows时,代码为):


    我的服务公司在流程设计中的名称。服务业的名义价值。(将MYSERVICE替换为要处理的服务的名称。您可以在服务属性上看到该服务的名称。)

    如果该服务是以这种方式启动的,我还希望发送一封电子邮件,因此在@Ic代码中添加了一些内容,我想我会发布它,以防它对任何人都有帮助。我使用了SendMail,但还有其他命令行选项


    我刚刚发现了这个帖子,如果这个人不想使用批处理文件重新启动服务,我想添加到讨论中。在Windows中,如果您转到“服务”、“服务属性”,然后转到“恢复”,则有一个选项。您可以在此处设置服务的参数。如果服务停止,您希望重新启动服务。此外,您甚至可以进行第二次失败尝试,以执行与重新启动计算机不同的操作

    独立于语言的版本

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

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

    启停服务

    在任务计划程序中,如果您在服务器上使用它,请在参数中使用此选项

    -noprofile-executionpolicy旁路-C:\Service Restart Scripts\stopsservice.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
    }
    }
    

    关于@danielserano的回答,我最近被
    sc.exe
    命令的本地化(即西班牙语)所困扰。我的建议是,将保存数字服务状态的线和令牌固定在点上,并对其进行解释,这应该更加可靠:

    @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
      )
    )
    
    通过以下方式进行测试:

    • Windows XP(32位)英语
    • Windows 10(32位)西班牙语
    • Windows 10(64位)英语

      • 也许是更简单的方法?只需在这里的答案列表中添加以下内容:

        @for /f "tokens=1,* delims=: " %%a in ('sc queryex state=Inactive') do net start "%%b"
        

        下面是适用于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
        )
        

        令人惊叹的。谢谢你的努力。不幸的是,它不起作用?也许我太蠢了,不能这么做。作为测试,我将“MyServiceName”替换为“SCardSvr”(转义),将所有内容放入一个批处理文件中,然后执行它,但服务不会启动。即使我用其他东西(比如打印到文件中)替换NetStart,它也不会被执行。你介意再看一眼吗?=)哦,我在第一行有一些额外的东西…试试这个。如果它不起作用,当您从命令行运行sc query“SCardSvr”时会发生什么?引号中有“SCardSvr”吗?“我认为不应该这样,”小矮人说:“你说得对。如果没有引用,它就成功了。我真傻:-谢谢你的帮助help@Mark值得注意。我想您必须用目标操作系统语言所需的任何字符串替换该字符串。我认为“运行”也是一样。感谢您的帮助,在尝试整合您发布的内容时,我大大提高了我的批处理技能;)肮脏编程:如果服务没有运行,您只想启动它,只需发出start命令。如果它没有运行,它将启动服务。如果服务正在运行,则会收到一条错误消息,但服务正在运行(并且没有停止)。脏,但它能工作。但是,如果您只想在必须启动服务的情况下执行其他注释,则必须使用lc的更干净版本。@Peter Schuetze:是的,如果启动服务是唯一目的,您的反对意见是正确的。我还包括了日志启动等等,所以我坚持使用lc的解决方案,因为从一开始就有退出代码。如果start命令失败,可能是因为它已经在运行(并且随后停止它的任何一种方式都不会造成伤害),因此您可以尝试停止它。该命令的结构是,如果net start失败,它将停止它(由于| |,这意味着else),
        @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
        
        $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
        
        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
          )
        )
        
        @for /f "tokens=1,* delims=: " %%a in ('sc queryex state=Inactive') do net start "%%b"
        
        @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
        )