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

     2023-02-16     156

关键词:

【中文标题】检查 Windows 服务列表是不是正在运行,如果不是从批处理文件启动【英文标题】:check if a list of windows services are running and start if not from batch file检查 Windows 服务列表是否正在运行,如果不是从批处理文件启动 【发布时间】:2021-06-26 09:12:26 【问题描述】:

我正在寻找一个批处理脚本来检查是否有一些服务正在运行,如果没有启动它们,这就是我到目前为止检查特定服务是否正在运行的内容:

for /F "tokens=3 delims=: " %%H in ('sc query "service1" ^| findstr "        STATE"') do (
  if /I "%%H" NEQ "RUNNING" (
   net start "service1"
  )

但是,我想修改这个 for 循环以检查是否有其他服务的匹配项,例如“service2”、“service3”、“service4”和“service5”,但我不知道该怎么做.是否可以将这些匹配项包含在同一个 For 循环中?

谢谢

【问题讨论】:

不是检查字符串RUNNING那么简单。一个服务,如果启动了,可以有多个状态,仅仅因为状态不是RUNNING,并不代表它可以启动。状态可以是StoppedStart PendingStop PendingRunningContinue PendingPause PendingPausedUnknown。无论如何,我不确定如果您要求启动已在运行的服务会发生什么,但我假设可能只是一条错误消息,(您可以发送到NUL)。那么为什么不尝试启动所有这些,看看会发生什么。使用sc start,而不是net start 【参考方案1】:

这是一个你可能没有考虑过的替代方案,(忽略了我之前评论中的建议),它可以直接在 cmd 中运行,或者从 batch-file 中运行:

%SystemRoot%\System32\wbem\WMIC.exe Service Where "Name='Service1' Or Name='Service2' Or Name='Service3' Or Name='Service4 Or Name='Service5 And Started='TRUE' And State !='Running'" Call StartService >NUL 2>&1

您需要自己决定是否需要 Started='TRUE' 部分,但我建议您首先一定要保留它。

【讨论】:

我试试看是否需要相应地调整“开始”标志,谢谢【参考方案2】:

如果您想在一个循环中使用 FOR 批量执行此操作:

FOR /F "tokens=2,3 delims=: " %%H IN ('^(SC QUERY "Service1" ^& SC QUERY "Service2"^) ^| FINDSTR /C:"SERVICE_NAME" /C:"        STATE" ') DO (IF NOT "%%H" == "" (IF "%%I" == "" SET LOCALV_SERV=%%H) & IF NOT "%%I" == "" (IF /I "%%I" NEQ "RUNNING" CALL NET START %%LOCALV_SERV%%))

我们通过连接多个 SC 输出一次查询多个服务,然后在这里使用 FINDSTR 功能一次搜索多个字符串以获得服务名称和服务状态。

按照@Compo 的建议,您应该测试许多其他服务状态。

那么对于您的用例,命令应该是:

FOR /F "tokens=2,3 delims=: " %%H IN ('^(SC QUERY "Service1" ^& SC QUERY "Service2" ^& SC QUERY "Service3" ^& SC QUERY "Service4" ^& SC QUERY "Service5"^) ^| FINDSTR /C:"SERVICE_NAME" /C:"        STATE" ') DO (IF NOT "%%H" == "" (IF "%%I" == "" SET LOCALV_SERV=%%H) & IF NOT "%%I" == "" (IF /I "%%I" NEQ "RUNNING" CALL NET START %%LOCALV_SERV%%))

将 Service1、Service2、Service3、Service4、Service5 替换为您要定位的服务名称。

由于@Compo 指出使用 CALL 进行延迟扩展可能不合适,因此这里是显式启用延迟扩展的相同脚本:

SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "tokens=2,3 delims=: " %%H IN ('^(SC QUERY "Service1" ^& SC QUERY "Service2"^) ^| FINDSTR /C:"SERVICE_NAME" /C:"        STATE" ') DO (IF NOT "%%H" == "" (IF "%%I" == "" SET LOCALV_SERV=%%H) & IF NOT "%%I" == "" (IF /I "%%I" NEQ "RUNNING" NET START !LOCALV_SERV!))

这是我的答案的扩展,基于 cmets,它仅在循环内需要的地方启用延迟扩展。这个版本还去掉了对%PATH%%PATHEXT%的依赖,提高了可读性:

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion

Set "SC=%SystemRoot%\System32\sc.exe"
Set "FS=%SystemRoot%\System32\findstr.exe"

For /F "Tokens=2-3 Delims=: " %%G In ('
    (%SC% Query "Service1" ^&
     %SC% Query "Service2" ^&
     %SC% Query "Service3" ^&
     %SC% Query "Service4" ^&
     %SC% Query "Service5"^) 2^>NUL
     ^| %FS% /BIC:"SERVICE_NAME:" /C:"        STATE "
') DO (
    If Not "%%G" == "" If "%%H" == "" Set "LOCALV_SERV=%%G"
    If Not "%%H" == "" If /I Not "%%H" == "RUNNING" (
        SetLocal EnableDelayedExpansion
        %SC% Start !LOCALV_SERV!
        EndLocal
    )
)

【讨论】:

谢谢,请问 service1 和 service2 是什么,以便我可以确定是否需要在我的用例中添加 3,4 和 5?我可以安全地假设我可以将我的字符串匹配附加到 FINDSTR,有点像这样 'FINDSTR /C:"service1" /C:"service2" ? @user1283674 您不需要更改 FINDSTR,它会从 sc 输出中自行获取服务名称。如果您有 5 个服务要检查,只需将 SC QUERY "Service1" ^& SC QUERY "Service2" 更改为 SC QUERY "Service1" ^& SC QUERY "Service2" ^& SC QUERY "Service3" ^& SC QUERY "Service4" ^& SC QUERY "Service5" 明白了,感谢您的宝贵时间 我认为在另一个 cmd.exe 实例中运行多个 sc.exe 命令和一个 findstr.exe 没有任何好处,然后是一系列 if 命令和一个 net.exe 命令, 做一个WMIC.exe 命令可以做的事情。还有为什么要使用不同的可执行文件net.exe,当你已经使用sc.exe,并且已经可以start 一个服务。此外,net.exe 不是批处理文件,如果您查看Call 命令的帮助信息,(命令提示符窗口中的call /?,您应该注意在这种情况下,Call 不是必需的或不需要的。 是的 Zilog80,我希望你不介意,但我添加了一个额外的示例,仅在需要的地方延迟扩展,在循环中,你的答案。我也赞成它,因为虽然它的效率较低,但从技术上讲,它是对特定问题的直接回答

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

】如何通过批处理文件检查服务是不是正在运行并启动它,如果它没有运行?【英文标题】:Howtocheckifaserviceisrunningviabatchfileandstartit,ifitisnotrunning?如何通过批处理文件检查服务是否正在运行并启动它,如果它没有运行?【发布时... 查看详情

检查(作为普通用户)是不是正在运行管理进程(C、Windows)

】检查(作为普通用户)是不是正在运行管理进程(C、Windows)【英文标题】:Check(asnormaluser)ifadminprocessisrunning(C,Windows)检查(作为普通用户)是否正在运行管理进程(C、Windows)【发布时间】:2015-02-1716:39:29【问题描述】:我正... 查看详情

如何使用 C++ 检查进程是不是正在运行

】如何使用C++检查进程是不是正在运行【英文标题】:HowtocheckifaprocessisrunningornotusingC++如何使用C++检查进程是否正在运行【发布时间】:2012-05-1714:49:47【问题描述】:如果一个进程没有运行,我不应该显示某些上下文菜单选项?... 查看详情

如何验证 Windows 服务是不是正在运行

】如何验证Windows服务是不是正在运行【英文标题】:HowcanIverifyifaWindowsServiceisrunning如何验证Windows服务是否正在运行【发布时间】:2010-09-1517:49:18【问题描述】:我有一个C#应用程序(在XP嵌入式上运行2.0),它与作为Windows服务... 查看详情

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

】如何检查服务是不是正在运行[重复]【英文标题】:howtocheckifserviceisrunningornot[duplicate]如何检查服务是否正在运行[重复]【发布时间】:2013-04-0709:18:52【问题描述】:我想显示服务状态,如果它正在运行或停止。我正在使用下面... 查看详情

如何检查是不是在 C# 中安装了 Windows 服务

】如何检查是不是在C#中安装了Windows服务【英文标题】:HowtocheckifawindowsserviceisinstalledinC#如何检查是否在C#中安装了Windows服务【发布时间】:2011-06-0101:06:39【问题描述】:我编写了一个Windows服务,它将WCF服务公开给安装在同一... 查看详情

如何检查 Kafka Server 是不是正在运行?

】如何检查KafkaServer是不是正在运行?【英文标题】:HowtocheckwhetherKafkaServerisrunning?如何检查KafkaServer是否正在运行?【发布时间】:2016-10-2114:45:15【问题描述】:我想在开始生产和消费作业之前确保kafka服务器是否正在运行。它... 查看详情

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

】C#:如何以编程方式检查Web服务是不是已启动并正在运行?【英文标题】:C#:Howtoprogrammaticallycheckawebserviceisupandrunning?C#:如何以编程方式检查Web服务是否已启动并正在运行?【发布时间】:2012-08-1902:38:50【问题描述】:我需要... 查看详情

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

】检查服务是不是正在运行[重复]【英文标题】:checkifserviceisrunning[duplicate]检查服务是否正在运行[重复]【发布时间】:2013-04-0422:17:56【问题描述】:我想在用户强制关闭应用程序后检查服务是否正在运行。我怎样才能做到这一... 查看详情

Android:检查服务是不是正在运行。绑定服务

】Android:检查服务是不是正在运行。绑定服务【英文标题】:Android:Checkifserviceisrunningvia.bindServiceAndroid:检查服务是否正在运行。绑定服务【发布时间】:2011-05-2511:12:54【问题描述】:检查Android服务是否正在运行的最佳方法是... 查看详情

如何检查android后台服务线程是不是正在运行

publicstaticComponentNameisServiceExisted(Contextcontext,StringpackageName)ActivityManageractivityManager=(ActivityManager)context.getSystemService("activity");ListserviceList=activityManager.getRunningServices(Integer.MAX_VALUE);for(ActivityManager.RunningServiceInforunningServiceInfo:ser... 查看详情

用于检查服务是不是正在运行的 Python 代码。?

】用于检查服务是不是正在运行的Python代码。?【英文标题】:Pythoncodetocheckifserviceisrunningornot.?用于检查服务是否正在运行的Python代码。?【发布时间】:2018-03-1616:36:15【问题描述】:我正在使用python2.7来检查服务是否正在运行... 查看详情

检查条件是不是在布尔列表中成立

】检查条件是不是在布尔列表中成立【英文标题】:Checkingifconditionsholdinbooleanlist检查条件是否在布尔列表中成立【发布时间】:2015-04-0923:58:31【问题描述】:如果布尔值列表为真,我正在尝试运行一些函数。我的列表由布尔函... 查看详情

AdomdConnection 抛出“检查 'SQL Browser' 服务是不是正在运行”错误

】AdomdConnection抛出“检查\\\'SQLBrowser\\\'服务是不是正在运行”错误【英文标题】:AdomdConnectionthrowing"Checkthat\'SQLBrowser\'serviceisrunning"errorAdomdConnection抛出“检查\'SQLBrowser\'服务是否正在运行”错误【发布时间】:2016-10-2013:36... 查看详情

批处理文件以检查 exe 是不是正在运行,如果是,则 taskkill

】批处理文件以检查exe是不是正在运行,如果是,则taskkill【英文标题】:batchfiletocheckifexeisrunningifsotaskkill批处理文件以检查exe是否正在运行,如果是,则taskkill【发布时间】:2013-08-1908:27:08【问题描述】:我遇到了firefoxFlashplaye... 查看详情

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

】如何检查远程Oracle服务器是不是已启动并正在运行【英文标题】:HowtocheckremoteOracleserverisupandrunning如何检查远程Oracle服务器是否已启动并正在运行【发布时间】:2013-04-1704:21:38【问题描述】:我在远程机器上安装了我的Oracle服... 查看详情

tableau连接mysql时,出现无法连接服务器,检查服务器是不是正在运行以及您是不是有权访问?

怎么解决啊,求助当在Tableau中连接MySQL数据库时出现“无法连接服务器,检查服务器是否正在运行以及您是否有权访问”等错误提示时,可能是以下原因之一:1.MySQL服务器没有运行:请确认MySQL数据库服务器是否已经启动。可以... 查看详情

如何使用 Windows 批处理文件检查端口 8086 是不是正在侦听

】如何使用Windows批处理文件检查端口8086是不是正在侦听【英文标题】:howtocheckifport8086islistening,usingawindowsbatchfile如何使用Windows批处理文件检查端口8086是否正在侦听【发布时间】:2018-04-1104:20:52【问题描述】:需要检查进程是... 查看详情