如果名称相同,如何跳过服务

时间:2015-10-16 20:44:48

标签: windows batch-file windows-services

我是脚本世界的新手,正致力于远程停止和启动一系列Windows服务。

我遇到的问题......我有一系列服务,其名称一直到最后都需要按顺序停止。

示例:

  

APPNAME_Service_1111
  APPNAME_Service_1111_A
  APPNAME_Service_2222
  APPNAME_Service_2222_A

我想知道如何开始/停止服务APPNAME_Service_1111APPNAME_Service_2222然后开始/停止APPNAME_Service_1111_AAPPNAME_Service_2222_A秒。

所以像APPNAME_Service_%%%%_A这样的服务会做第二个/最后一个

我使用此脚本作为基础。

@echo off

:choice
set /P c=This will stop X Services Are you sure you want to continue[Y/N]?
if /I "%c%" EQU "Y" goto :stopservice1
if /I "%c%" EQU "N" goto :end

goto :choice

echo "stopping services now"
:stopservice1
wmic /node:@list.txt  service where "name like '%%_service_%%XXX'" call stopservice

pause 
exit

:end

pause 
exit

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

让我们使用sc query中正在运行的服务列表:

SERVICE_NAME: TeamViewer
DISPLAY_NAME: TeamViewer 10
        TYPE               : 10  WIN32_OWN_PROCESS
        STATE              : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x0
        WAIT_HINT          : 0x0

然后通过服务名称和特殊标记findstr传递给SERVICE_NAME:,以确保在第一次传递中提取正确的行和/v /e命令行参数以排除第二遍中的后缀_A/e只需要它。

代码:

for %%a in ("/v /e" "/e") do (
    for /f "tokens=2" %%b in ('
        sc query ^| findstr "_Service_" ^| findstr "SERVICE_NAME:" ^| findstr %%~a "_A"
    ') do sc stop %%b
)