我想通过批处理文件执行以下操作:
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 标准。 有人可以帮我处理这个批处理文件吗?
让我们看看。首先,用
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
。
我知道这是一个旧线程,但响应 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"