lmm5353 2024-03-04 02:55 采纳率: 0%
浏览 27

批处理,reg query用法问题,求指导

想用批处理,reg query 做一个注册表查询功能,但是写了一段代码后,查询结果一直不对。请问有大~佬,帮忙指导一下嘛??或者
功能简介
1、用户输入补丁号 ,确定后
2、先查询注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages,存在Package_for_的项

img

3、从步骤2的结果中,继续根据补丁号查询,存在补丁号(如KB5012170),输出对应的注册表。这里遇到问题,有时可以有时不可以

img

4、如果步骤3没有查询到,继续查询步骤2的注册表项中的字段InstallLocation的值,如果包含用户输入的补丁号,输出注册表。如果没查到,提示用户:没有查询到。这里遇到问题,输入存在的补丁(KB5033920),一直查询不到

img

问题截图
步骤3:输入存在的补丁号,也查不到

img

步骤4:输入存在的补丁号,通过字段:InstallLocation,也查不到

img

bat脚本:

@echo off
:loop
echo 获取已安装补丁的注册表
set /p userInput=请输入补丁号: 
echo ---输入内容---: %userInput%

setlocal enabledelayedexpansion
rem set KBnum="kb5034767"kb5034862---KB5012170---KB5034123
set KBnum=%userInput%
for /f "tokens=*" %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages" ^| find "Package_for_"') do (
     set key=%%a

   
   echo  !key! | findstr  "%KBnum%" >nul
    if !errorlevel! equ 0 (
       echo 第一次查询,命中%KBnum%
       goto queryKBNum
    ) else (
        echo 第一次查询,没有命中%KBnum%
        goto queryKBInstallLocationNum
    )
        
)




:queryKBNum
echo 第一次查询,已找到补丁%KBnum%的注册表为:%key%
goto loop


:queryKBInstallLocationNum
 echo queryKBInstallLocation:  %key%


set key2=!key!

rem echo KBrum:%KBnum%
set "value=InstallLocation"
set "searchName=kb5034767"
for /f "tokens=2*" %%a in ('reg query "%key2%" /v "%value%" ^| findstr /i "%KBnum%"') do (
    echo 第二次查询,命中:%KBnum%
    echo 第二次查询,补丁%KBnum%的安装注册表为:%key%
    echo %value%: %%b

   
)
goto loop


PAUSE&exit



  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2024-03-04 08:28
    关注

    lmm5353 上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    根据你的描述,你想使用批处理脚本来查询注册表中的补丁号。查询的逻辑包括首先查询注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages,然后根据用户输入的补丁号进一步查询注册表。你遇到的问题是查询结果不正确。以下是一些建议和修改的代码:

    1. 修改步骤2的查询逻辑。在当前的代码中,你使用的是find命令查找“Package_for_”项,这可能会匹配到不完整的项。建议改为使用findstr命令,使用正则表达式进行模糊匹配。

    2. 修改步骤3查询的逻辑。在当前的代码中,你使用的是findstr命令来判断是否命中补丁号。但是,你的补丁号是变量,需要使用!KBnum!来引用变量。同时,由于!key!可能包含多个空格,findstr命令匹配时需要使用^符号进行转义。

    3. 修改步骤4的查询逻辑。在当前的代码中,你的查询逻辑是正确的,但是输出结果中的变量引用有问题。需要使用!key2!%%b来引用变量。

    下面是修改后的代码示例:

    @echo off
    setlocal enabledelayedexpansion
    
    :loop
    echo 获取已安装补丁的注册表
    set /p userInput=请输入补丁号: 
    echo ---输入内容---: %userInput%
    
    set "KBnum=%userInput%"
    
    for /f "tokens=*" %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\Packages" ^| findstr /R "Package_for_"') do (
        set "key=%%a"
        
        echo !key! | findstr /R "%KBnum%" >nul
        if !errorlevel! equ 0 (
            echo 第一次查询,命中%KBnum%
            goto queryKBNum
        ) else (
            echo 第一次查询,没有命中%KBnum%
            goto queryKBInstallLocationNum
        )
    )
    
    :queryKBNum
    echo 第一次查询,已找到补丁%KBnum%的注册表为:%key%
    goto loop
    
    :queryKBInstallLocationNum
    echo queryKBInstallLocation: %key%
    
    set "key2=!key!"
    set "value=InstallLocation"
    for /f "tokens=2*" %%a in ('reg query "!key2!" /v "%value%" ^| findstr /i "%KBnum%"') do (
        echo 第二次查询,命中:%KBnum%
        echo 第二次查询,补丁%KBnum%的安装注册表为:%key2%
        echo %value%: %%b
    )
    goto loop
    
    PAUSE&exit
    

    希望这可以帮助你解决问题。如果你还有其他问题,请随时提问。

    评论

报告相同问题?

问题事件

  • 修改了问题 3月4日
  • 创建了问题 3月4日