【问题标题】:Batch file to check if multiple services with a common word in their name are running and start them, if it is not running?批处理文件以检查名称中带有共同单词的多个服务是否正在运行并启动它们,如果它没有运行?
【发布时间】:2023-03-08 13:37:01
【问题描述】:

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

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"

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

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

我有一个服务器,上面有大约 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 标准。 有人可以帮我处理这个批处理文件吗?

【问题讨论】:

  • 首先注释掉@echo off -- 很多问题都可以轻松解决...

标签: web-services wcf batch-file service


【解决方案1】:

让我们看看。首先,使用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:DemoService 过滤列表:

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

【讨论】:

  • 我尝试使用 sc query state= all | 进行查询findstr /r /c:"DISPLAY_NAME: .*Demo .*Service" --- 工作正常,列出了所有服务。但是,当我使用您提供的代码创建一个批处理文件时,它没有做任何事情,我在它的末尾添加了暂停,它没有显示任何错误或任何东西。我错过了什么吗?
猜你喜欢
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 2018-05-11
  • 2014-11-15
  • 2013-08-19
  • 2021-07-30
  • 1970-01-01
相关资源
最近更新 更多