Batch file 如何循环使用Windows服务并将其与文本文件进行批量比较

Batch file 如何循环使用Windows服务并将其与文本文件进行批量比较,batch-file,Batch File,我做了一个批处理代码,这是一个安全检查,看看是否有任何系统服务已被修改 这将通过以前注册的文本文件工作,该文件包含每个Windows服务的名称 AJRouter ALG AppIDSvc Appinfo AppReadiness AppXSvc AudioEndpointBuilder Audiosrv autotimesvc AxInstSV BDESVC BFE BITS ... 我设法完成了代码在文本文件的每一行上循环的部分,并检查是否缺少任何Windows服务 @echo off fo

我做了一个批处理代码,这是一个安全检查,看看是否有任何系统服务已被修改

这将通过以前注册的文本文件工作,该文件包含每个Windows服务的名称

AJRouter
ALG
AppIDSvc
Appinfo
AppReadiness
AppXSvc
AudioEndpointBuilder
Audiosrv
autotimesvc
AxInstSV
BDESVC
BFE
BITS
...
我设法完成了代码在文本文件的每一行上循环的部分,并检查是否缺少任何Windows服务

@echo off
for /F "tokens=*" %%A in (WindowsServices.txt) do (
    SC QUERY %%A > NUL
    IF ERRORLEVEL 1060 (ECHO %%A IS MISSING)
)

PAUSE
我还希望我的代码检查文本文件中是否有未注册的新服务。经过几次尝试后,我找不到一种方法来实现我的想法。我该怎么做

@echo off

(   for /f "tokens=1,*" %%A in (
        'sc query type^= service type^= userservice state^= all ^| find "SERVICE_NAME:"'
    ) do @echo %%B
) > all.tmp

(   for /f "tokens=*" %%A in (
        'findstr /b /e /i /l /v /g:"WindowsServices.txt" "all.tmp"'
    ) do @echo + %%A

    for /f "tokens=*" %%A in (
        'findstr /b /e /i /l /v /g:"all.tmp" "WindowsServices.txt"'
    ) do @echo - %%A

    for /f "tokens=*" %%A in (
        'findstr /b /e /i /l /g:"all.tmp" "WindowsServices.txt"'
    ) do @echo   %%A
) > report.txt

del all.tmp
sort /+3 report.txt /o report.txt
type report.txt
如果要进一步处理输出,请使用更易于阅读和使用脚本处理的输出格式

输出解释为:

  • 如果Lead带有
    +
    ,则需要添加到WindowsServices.txt,即新建
  • 如果带有
    -
    的Lead位于WindowsServices.txt中,但不在注册表中,即丢失
  • 如果有空格,则在WindowsServices.txt和注册表中,即良好
如果不需要列出的最后一项,即良好,则删除最后一个
for
循环。为了完整性,我添加了它,以便考虑所有服务名称

findstr
使用:

  • /b
    匹配行首的模式
  • /e
    匹配行尾的模式
  • /i
    指定搜索不区分大小写
  • /l
    逐字使用搜索字符串
  • /g
    从指定文件获取搜索字符串
sort
按字母顺序获取所有服务名称

注意:早期的Windows操作系统可能没有
sc.exe
userservice
类型,例如Windows 7。该代码在Windows 10上运行,无需修改

如果要进一步处理输出,请使用更易于阅读和使用脚本处理的输出格式

输出解释为:

  • 如果Lead带有
    +
    ,则需要添加到WindowsServices.txt,即新建
  • 如果带有
    -
    的Lead位于WindowsServices.txt中,但不在注册表中,即丢失
  • 如果有空格,则在WindowsServices.txt和注册表中,即良好
如果不需要列出的最后一项,即良好,则删除最后一个
for
循环。为了完整性,我添加了它,以便考虑所有服务名称

findstr
使用:

  • /b
    匹配行首的模式
  • /e
    匹配行尾的模式
  • /i
    指定搜索不区分大小写
  • /l
    逐字使用搜索字符串
  • /g
    从指定文件获取搜索字符串
sort
按字母顺序获取所有服务名称


注意:早期的Windows操作系统可能没有
sc.exe
userservice
类型,例如Windows 7。代码可以在Windows 10上运行,无需修改。

给你一个开始:
for/f“tokens=1*%a in('sc query^ find“SERVICE_NAME'))do@echo%b给你一个开始:
for/f“tokens=1*%a in('sc query^ find“SERVICE_NAME')do@echo%b
你的代码工作正常,但我不知道为什么,它提供了错误的信息的三个检查,它做。感谢您的图片,它有助于识别所需内容。在
sc.exe
中添加了一些参数以匹配图像中的服务。在没有额外参数的情况下,
sc.exe
仅输出运行的
服务
,而没有输出任何
用户服务
。非常感谢。它工作得很好。你做的每件事都比我做的更好,哈哈。你的代码运行得很好,但我不知道为什么,它在三个检查中给出了错误的信息。感谢您的图片,它有助于识别所需内容。在
sc.exe
中添加了一些参数以匹配图像中的服务。在没有额外参数的情况下,
sc.exe
仅输出运行的
服务
,而没有输出任何
用户服务
。非常感谢。它工作得很好。你做的每件事都比我做的更好,哈哈。