检查 windows 服务列表是否为 运行,如果不是从批处理文件启动
check if a list of windows services are running and start if not from batch file
我正在寻找一个批处理脚本来检查是否有一些服务 运行 如果没有启动它们,这就是我到目前为止要检查的特定服务是否 运行:
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 循环中?
谢谢
这里有一个你可能没有考虑过的替代方案,(忽略了我之前评论中的建议),可以直接在cmd, or from a 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'
部分是否是必需的,但我建议您一定要先保留它。
如果您想在一个循环中使用 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!))
根据评论,这是我的答案的扩展,它仅在循环中需要的地方启用延迟扩展。此版本还删除了对 %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
)
)
我正在寻找一个批处理脚本来检查是否有一些服务 运行 如果没有启动它们,这就是我到目前为止要检查的特定服务是否 运行:
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 循环中?
谢谢
这里有一个你可能没有考虑过的替代方案,(忽略了我之前评论中的建议),可以直接在cmd, or from a 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'
部分是否是必需的,但我建议您一定要先保留它。
如果您想在一个循环中使用 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!))
根据评论,这是我的答案的扩展,它仅在循环中需要的地方启用延迟扩展。此版本还删除了对 %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
)
)