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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过批处理文件检查服务是否正在运行并启动它,如果它没有运行?相关的知识,希望对你有一定的参考价值。

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

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

到目前为止我用Google搜索的代码示例结果不起作用,所以我决定不发布它们。

通过以下方式启动服务:

net start "SERVICENAME"
  1. 如何检查服务是否正在运行,以及如何在批处理文件中创建if语句?
  2. 我有点困惑。我必须传递到网络开始的论点是什么?服务名称或显示名称?
答案

要检查服务的状态,请使用sc query <SERVICE_NAME>。对于批处理文件中的if块,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的论点是服务名称,而不是显示名称。

另一答案

使用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:UserskrakhilDesktopPowershellLogsStartService_$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
另一答案

与@DanielSerrano的答案相关,我最近对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%system32sc.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
)
另一答案

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

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

以上是关于如何通过批处理文件检查服务是否正在运行并启动它,如果它没有运行?的主要内容,如果未能解决你的问题,请参考以下文章

检查 Windows 服务列表是不是正在运行,如果不是从批处理文件启动

如何检查远程 Oracle 服务器是不是已启动并正在运行

C#:如何以编程方式检查 Web 服务是不是已启动并正在运行?

如何使用cron检查程序是否在后台运行,并在需要时启动它?

如何检查服务是不是正在运行[重复]

检查 NFS 共享是不是在 PHP 中启动