批处理文件来检查名称中具有常用单词的多个服务是否正在运行,如果没有运行则启动它们?

问题描述 投票:0回答:2

我想通过批处理文件执行以下操作:

Action--> 检查名称中包含共同单词的多个服务是否正在运行,例如以下条件:

      1) IF services name contain word "Demo Service"
      2) IF services name contain word "Demo Mobile Service"
      3) IF services name contain word "Demo StTime Service"

操作-->如果所有服务都在运行,则退出批处理!

操作-->如果一个或多个服务没有运行,则逐个启动服务

我有一台服务器,上面有大约 50 个服务,服务的示例名称:

001122 演示服务

001122 演示移动服务

001252 演示服务

001252 演示移动服务

001252 演示 StTime 服务

由于某些原因(资源是其中之一),很少有服务会在任何随机时间停止,所以我需要这个脚本工作,直到我获得更多资源。

我找到了一些零碎的东西,并尝试将它们编译如下。

@ECHO off
SETLOCAL EnableDelayedExpansion

set "SERVICE_NAME=Demo Service"
echo %SERVICE_NAME%
FOR /L %%G IN (1,1,100) DO (
set "SERVICE_NAME=%SERVICE_NAME%%%G"
echo Starting "!SERVICE_NAME!"
net start "!SERVICE_NAME!"
)

set "M_SERVICE_NAME=Demo Mobile Service"
echo %M_SERVICE_NAME%
FOR /L %%G IN (1,1,100) DO (
set "M_SERVICE_NAME=%M_SERVICE_NAME%%%G"
echo Starting "!M_SERVICE_NAME!"
net start "!M_SERVICE_NAME!"
)

set "ST_SERVICE_NAME=Demo StTime Service"
echo %ST_SERVICE_NAME%
FOR /L %%G IN (1,1,100) DO (
set "ST_SERVICE_NAME=%ST_SERVICE_NAME%%%G"
echo Starting "!ST_SERVICE_NAME!"
net start "!ST_SERVICE_NAME!"
)

第一个问题,由于 FOR 循环,它尝试查找 100 个服务,第二个问题是它说无效的服务名称,所以我不确定如何修复 lixe 标准。 有人可以帮我处理这个批处理文件吗?

web-services wcf batch-file service
2个回答
0
投票

让我们看看。首先,用

sc query state= all
列出所有服务,这将给出此类项目的长列表:

SERVICE_NAME: w32time  
DISPLAY_NAME: Windows Time  
        TYPE               : 20  WIN32_SHARE_PROCESS  
        STATE              : 4  RUNNING  
                                (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)  
        WIN32_EXIT_CODE    : 0  (0x0)  
        SERVICE_EXIT_CODE  : 0  (0x0)  
        CHECKPOINT         : 0x0  
        WAIT_HINT          : 0x0  
        PID                : 1064  
        FLAGS              :

现在按

DISPLAY_NAME:
Demo
Service
过滤列表:

sc query state= all | findstr /r /c:"DISPLAY_NAME: .*Demo .*Service"

输出将是:

DISPLAY_NAME:001122 演示服务
DISPLAY_NAME:001122 演示移动服务
DISPLAY_NAME:001252 演示服务
DISPLAY_NAME:001252 演示移动服务
DISPLAY_NAME:001252 演示 StTime 服务

现在获取第一个单词后的文本并启动服务。
最终代码为:

@echo off
for /f "tokens=1*" %%a in ('
    sc query state^= all ^| findstr /r /c:"DISPLAY_NAME: .*Demo .*Service"
') do net start "%%b"

要隐藏消息,请使用

net start "%%b" 2>nul


0
投票

我知道这是一个旧线程,但响应 wOxxOm 给出的已接受答案:

您应该查询

SERVICE_NAME
而不是
DISPLAY_NAME
。这是因为服务的显示名称可能与实际服务名称本身不同,并且
net
命令使用服务名称。

因此,wOxxOm 提供的更新代码将是:

@echo off
for /f "tokens=1*" %%a in ('
    sc query state^= all ^| findstr /r /c:"SERVICE_NAME: .*Demo .*Service"
') do net start "%%b"
© www.soinside.com 2019 - 2024. All rights reserved.