找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 3584|回复: 14

[注册表类] [已解决]批处理怎样查询注册表值,设置变量?

[复制链接]
发表于 2025-9-5 14:26:26 | 显示全部楼层 |阅读模式
本帖最后由 剑气如霜 于 2025-9-6 11:35 编辑

HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\xxx,这个xxx是不确定数据,每个版本都不同,下面有2个键值,

DisplayIcon,数据是C:\Program Files\Common Files\Adobe\Adobe Illustrator CS6\ai_install_pkg_rev.ico
DisplayVersion,数据是16.0

先查询DisplayIcon的数据,如果DisplayIcon的数据包含Illustrator关键词,则获取DisplayVersion的数据的前两位,也就是16,忽略小数点,然后写入注册表数据,
reg add "HKEY_CURRENT_USER\Software\Adobe\CSXSPreferences" /v PlayerDebugMode /d 1 /f
最后面的那个CSXSPreferences是和DisplayVersion的前两位是相关的,DisplayVersion从16开始,对应的键值CSXS.3会出现递增特性,这个要设置变量写。下面是对应格式

14        CSXSPreferences
15        CSXS2Preferences
16        CSXS.3
17        CSXS.4
18        CSXS.5
19        CSXS.6
20        CSXS.7
21        CSXS.8
……        ……

请帮忙写bat代码,最好不要包含PowerShell命令,那个完全搞不懂
发表于 2025-9-5 16:59:29 | 显示全部楼层
回复 1# 剑气如霜


双击文件 C:\Windows\System32\cmd.exe
在打开的CMD窗口中执行以下命令:
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s > 1.txt
回车
把生成的1.txt文件上传到网盘
发表于 2025-9-5 17:03:24 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-9-5 17:10 编辑

回复 1# 剑气如霜

试试以下批处代码...

  1. @echo off &setlocal enabledelayedexpansion&set "ok="
  2. for %%v in ("_#14=CSXSPreferences" "_#15=CSXS2Preferences" "_#16=CSXS.3" "_#17=CSXS.4" "_#18=CSXS.5" "_#19=CSXS.6" "_#20=CSXS.7" "_#21=CSXS.8") do set %%v
  3. reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\ /s|findstr /in "\Software\Microsoft\Windows\CurrentVersion\Uninstall displayicon displayversion">#.$
  4. for /f "tokens=1* delims=:" %%a in ('find /i "Adobe Illustrator "^<#.$') do (
  5.    set/a "n=%%a-1,ok=1"
  6.    for /f "tokens=1* delims=:" %%x in ('find "!n!:"^<#.$') do for /f "tokens=3 delims=. " %%v in ("%%y") do reg add "HKEY_CURRENT_USER\Software\Adobe\!_#%%v!" /v PlayerDebugMode /d 1 /f)
  7. if not defined ok (echo,未发现注册表目标项) else echo,完成
  8. del /q "#.$" &pause&exit/b
复制代码
 楼主| 发表于 2025-9-5 19:44:44 | 显示全部楼层
回复 2# Batcher

按你的要求把注册表的内容导出来了,删掉了多余的内容,只留了3个项目。
我的想法就是通过查找illustrator在注册表的卸载路径,找到版本号,然后在HKEY_CURRENT_USER\Software\Adobe\CSX……项写入数据,版本号和CSX这个项目的对应关系就是1楼那种格式。比如我下面贴出来的illustratro 2018版本号是22.0.1,那么对应的项目就是CSX.9,Illustrator 2022版本号是26,就对应CSX.13

下面是注册表导出的内容
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Esko boostX for Adobe Illustrator
    DisplayName    REG_SZ    Esko boostX for Adobe Illustrator
    DisplayIcon    REG_SZ    C:\Esko\bg_prog_boostx_v010\uninstall\esko.ico
    UninstallString    REG_SZ    cmd /c start /min C:\Windows\eguninstall.bat C:\Esko\bg_prog_boostx_v010\uninstall\bpuninstall bpuninstall.exe x
    Publisher    REG_SZ    Esko

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\ILST_22_0_1
    DisplayName    REG_SZ    Adobe Illustrator CC 2018
    DisplayIcon    REG_SZ    C:\Program Files\Adobe\Adobe Illustrator CC 2018\Support Files\Contents\Windows\AI_Application_Icon.ico
    DisplayVersion    REG_SZ    22.0.1
    URLInfoAbout    REG_SZ    Adobe Illustrator CC 2018
    UninstallString    REG_SZ    "C:\Program Files (x86)\Adobe\Adobe Creative Cloud\HDCore\Uninstaller.exe" --uninstall=1 --sapCode=ILST --productVersion=22.0.1 --productPlatform=win64 --productAdobeCode={ILST-22.0.1-64-ADBEADBEADBEADBEADBEA} --productName="Illustrator CC" --mode=1
    VersionMajor    REG_SZ    22
    VersionMinor    REG_SZ    0
    Publisher    REG_SZ    Adobe Systems Incorporated
    InstallLocation    REG_SZ    C:\Program Files\Adobe\Adobe Illustrator CC 2018
    EstimatedSize    REG_DWORD    0x148f0c

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\ILST_26_0_1
    DisplayName    REG_SZ    Adobe Illustrator 2022
    DisplayIcon    REG_SZ    C:\Program Files\Adobe\Adobe Illustrator 2022\Support Files\Contents\Windows\AI_Application_Icon.ico
    DisplayVersion    REG_SZ    26.0.1
    URLInfoAbout    REG_SZ    https://www.adobe.com/go/ai_support
    UninstallString    REG_SZ    "C:\Program Files (x86)\Common Files\Adobe\Adobe Desktop Common\HDBox\Uninstaller.exe" --uninstall=1 --sapCode=ILST --productVersion=26.0.1 --productPlatform=win64 --productAdobeCode={ILST-26.0.1-64-ADBEADBEADBEADBEADBEA} --productName="Illustrator" --mode=1
    VersionMajor    REG_SZ    26
    VersionMinor    REG_SZ    0
    Publisher    REG_SZ    Adobe Inc.
    InstallLocation    REG_SZ    C:\Program Files\Adobe\Adobe Illustrator 2022
    InstallDate    REG_SZ    8/7/2025
    EstimatedSize    REG_DWORD    0x19d45a
 楼主| 发表于 2025-9-5 20:27:54 | 显示全部楼层
回复 3# aloha20200628

运行以后没反应,没暂停,直接退出了。可能是我没表达清楚,在4楼又重新表达了一遍。
发表于 2025-9-5 20:43:27 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-9-6 08:33 编辑

回复 5# 剑气如霜

以下测试版代码针对4楼的示例样本,假设存为 1.txt,代码中增加两个针对 22=CSXS.9 和 26=CSXS.13 的变量定义
楼主认可运行结果后,可删除代码第5行中的 echo, 即成实用版(真正写入注册表)...


  1. @echo off &setlocal enabledelayedexpansion &set "ok=" &findstr /n .* "1.txt">#.$
  2. for %%v in ("_#14=CSXSPreferences" "_#15=CSXS2Preferences" "_#16=CSXS.3" "_#17=CSXS.4" "_#18=CSXS.5" "_#19=CSXS.6" "_#20=CSXS.7" "_#21=CSXS.8" "_#22=CSXS.9" "_#26=CSXS.13") do set %%v       
  3. for /f "tokens=1* delims=:" %%a in ('findstr /irc:" displayicon .*Adobe Illustrator" #.$') do (
  4.    set/a "n=%%a+1,ok=1"
  5.    for /f "tokens=1* delims=:" %%x in ('find "!n!:"^<#.$') do for /f "tokens=3 delims=. " %%v in ("%%y") do echo,reg add "HKEY_CURRENT_USER\Software\Adobe\!_#%%v!" /v PlayerDebugMode /d 1 /f)
  6. if not defined ok (echo,未发现注册表目标项) else echo,完成
  7. del /q "#.$" &pause&exit/b
复制代码

评分

参与人数 1技术 +1 收起 理由
剑气如霜 + 1 你们思维是真的厉害

查看全部评分

发表于 2025-9-6 08:23:19 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-9-6 09:08 编辑

回复 5# 剑气如霜

调整了锚定 displayVersion 的算法,应该会提高匹配准确度,以下测试版代码取代3楼代码用于直接搜索注册表键值...

  1. @echo off &setlocal enabledelayedexpansion &set "ok="
  2. for %%v in ("_#14=CSXSPreferences" "_#15=CSXS2Preferences" "_#16=CSXS.3" "_#17=CSXS.4" "_#18=CSXS.5" "_#19=CSXS.6" "_#20=CSXS.7" "_#21=CSXS.8" "_#22=CSXS.9" "_#26=CSXS.13") do set %%v
  3. reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall" /s|findstr /ni "hkey_ displayicon displayversion">#.$
  4. for /f "delims=:" %%n in ('findstr /irc:" displayicon .*Adobe Illustrator" #.$') do (
  5.    set/a "n1=%%n-1,n2=%%n+1,ok+=1"
  6.    for /f "tokens=2,4 delims=:. " %%a in ('findstr "!n1!: !n2!:" #.$') do if /i "%%a"=="displayversion" echo,reg add "HKEY_CURRENT_USER\Software\Adobe\!_#%%b!" /v PlayerDebugMode /d 1 /f)
  7. if not defined ok (echo,未发现注册表目标项) else echo,完成
  8. del /q "#.$" &pause&exit/b
复制代码
楼主认可运行结果后,可删除代码第6行中的 echo, 即成实用版(真正写入注册表)...

评分

参与人数 1技术 +1 收起 理由
剑气如霜 + 1 反正就是很厉害

查看全部评分

发表于 2025-9-6 11:31:47 | 显示全部楼层
本帖最后由 WHY 于 2025-9-7 14:21 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "regPath=HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
  4. set "keyWord=Illustrator"

  5. set "found="

  6. for /f "delims=:" %%i in ('findstr /b /n ":::::" "%~f0"') do (
  7.     for /f "tokens=1*" %%j in ('more +%%i "%~f0"') do (
  8.        set "_%%j=%%k"
  9.     )
  10. )

  11. for /f "tokens=*" %%i in ('reg query "%regPath%" /f "%keyWord%" /d /s') do (
  12.     set "str=%%i"
  13.     if /i "!str:~0,4!" == "HKEY" (
  14.         set "subPath=%%i"
  15.     ) else if /i "!str:~0,11!" == "displayIcon" (
  16.         for /f "tokens=3" %%j in ('reg query "!subPath!" /v "displayVersion" 2^>nul') do (
  17.             set "version=%%j"
  18.         )
  19.     )
  20.     if defined version (
  21.         set found=1
  22.         call :Next
  23.         set "version="
  24.     )
  25. )

  26. if not defined found (
  27.     echo;No such registry key or value found.
  28. )
  29. pause & exit

  30. :Next
  31. for /f "delims=" %%i in ("!subPath!") do (
  32.     set "appName=%%~nxi"
  33. )

  34. for /f "tokens=1,2 delims=." %%a in ("!version!") do (
  35.     if defined _%%a.%%b (
  36.         echo;!appName! ---^> !version! ---^> !_%%a.%%b!
  37.         echo reg add "HKCU\Software\Adodb\!_%%a.%%b!" /v PlayerDebugMode /d 1 /f
  38.     ) else if defined _%%a (
  39.         echo;!appName! ---^> !version! ---^> !_%%a!
  40.         echo reg add "HKCU\Software\Adodb\!_%%a!" /v PlayerDebugMode /d 1 /f
  41.     ) else (
  42.         echo;!appName! ---^> !version! ---^> ERROR.
  43.     )
  44. )
  45. goto :EOF

  46. ::::::::::::VersionList::::::::::::
  47. 14.0      CSXSPreferences
  48. 15.0      CSXS2Preferences
  49. 15.1      CSXS.2.5
  50. 16        CSXS.3
  51. 17        CSXS.4
  52. 18        CSXS.5
  53. 19        CSXS.6
  54. 20        CSXS.7
  55. 21        CSXS.7
  56. 22        CSXS.8
  57. 23        CSXS.9
  58. 24        CSXS.9
  59. 25        CSXS.10
  60. 26        CSXS.11
  61. 27        CSXS.11
  62. 28        CSXS.11
  63. 29        CSXS.12
复制代码

评分

参与人数 1技术 +1 收起 理由
剑气如霜 + 1 谢谢!

查看全部评分

 楼主| 发表于 2025-9-6 11:35:05 | 显示全部楼层
经过一晚上的安装测试,很遗憾这个话题要关闭了。AI版本号和CSXS号码的对应关系一开始就错了,是我想简单了,开始我拿代码去测试,发现总是结果不对。然后我把所有版本从CS4-CS2025全部装了一遍,发现只有前面某些版本是按顺序递增的,后面的版本毫无规律,有时候几个版本共用一个CSXS号码,所以应该是没办法按变量的方式来自动对应了。谢谢楼上几位大佬的热情,给你们贴麻烦了。
发表于 2025-9-6 11:52:00 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-9-6 12:01 编辑

回复 9# 剑气如霜

所给代码中对变量对应关系的定义不怕 csxs... 值是否重复或递增或递减,例如:
12        CSXSPreferences
13        CSXSPreferences
     
14        CSXS2Preferences
15        CSXS2Preferences

16        CSXS.5
17        CSXS.4
18        CSXS.3

19        CSXS.6
20        CSXS.7
21        CSXS.8
22        CSXS.8
23        CSXS.8

只要给出的变量定义能覆盖全部示例即可...
 楼主| 发表于 2025-9-6 13:57:34 | 显示全部楼层
本帖最后由 剑气如霜 于 2025-9-6 14:29 编辑

回复 8# WHY
虽然这个帖子因为数据对应关系错误,而导致功能实现不了,但是代码是可以用来学习的。用大佬你的代码,显示的是No such registry key or value found.其实昨晚我用AI写了一段代码,是可以正常运行的,只是看起来没你写的高级,我也贴出来吧
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. rem 根据系统架构设置注册表路径
  4. if "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
  5.     set "uninstall_path=HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
  6. ) else (
  7.     set "uninstall_path=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
  8. )

  9. rem 获取所有子项名称
  10. for /f "tokens=*" %%a in ('reg query "%uninstall_path%"') do (
  11.     set "subkey=%%a"
  12.    
  13.     rem 跳过根键本身
  14.     if not "!subkey!"=="%uninstall_path%" (
  15.         
  16.         rem 检查DisplayIcon值是否包含"Illustrator"
  17.         for /f "tokens=2*" %%b in ('reg query "!subkey!" /v DisplayIcon 2^>nul') do (
  18.             set "display_icon=%%c"
  19.             echo !display_icon! | find /i "Illustrator" >nul
  20.             if !errorlevel! equ 0 (
  21.                
  22.                 rem 获取DisplayVersion值
  23.                 for /f "tokens=2*" %%d in ('reg query "!subkey!" /v DisplayVersion 2^>nul') do (
  24.                     set "version=%%e"
  25.                     
  26.                     rem 忽略小数点,提取主版本号
  27.                     for /f "tokens=1 delims=." %%v in ("!version!") do (
  28.                         set "major_version=%%v"
  29.                         
  30.                         rem 计算对应的注册表项名称
  31.                         if !major_version! equ 14 (
  32.                             set "pref_key=CSXSPreferences"
  33.                         ) else if !major_version! equ 15 (
  34.                             set "pref_key=CSXS2Preferences"
  35.                         ) else if !major_version! gtr 15 (
  36.                             set /a csxs_num=!major_version! - 13
  37.                             set "pref_key=CSXS.!csxs_num!"
  38.                         ) else (
  39.                             echo 不支持的版本: !major_version!
  40.                             continue
  41.                         )
  42.                         
  43.                         rem 写入注册表设置
  44.                         if defined pref_key (
  45.                             echo 找到 Illustrator 版本 !version!,主版本 !major_version!
  46.                             echo 写入注册表: HKEY_CURRENT_USER\Software\Adobe\!pref_key!
  47.                             reg add "HKEY_CURRENT_USER\Software\Adobe\!pref_key!" /v PlayerDebugMode /d 1 /f
  48.                             echo.
  49.                         )
  50.                     )
  51.                 )
  52.             )
  53.         )
  54.     )
  55. )

  56. echo 处理完成!
  57. pause
复制代码
 楼主| 发表于 2025-9-6 14:20:43 | 显示全部楼层
回复 10# aloha20200628


    真正的对应关系其实比较复杂,因为小数点的存在,每个人电脑可能安装的版本不一样,所以我想着取整数位,但是又有例外比如CS5.5的版本号是15.1,它独自对应一个CSXS号,这还不是重点,主要是如果Adobe软件的版本号跟CSXS号之间如果没有规律,那以后出新版本就只能手动去添加到代码里面了,感觉失去自动化的前提了。
14.0        CSXSPreferences
15.0        CSXS2Preferences
15.1        CSXS.2.5
16.x        CSXS.3
17.x        CSXS.4
18.x        CSXS.5
19.x        CSXS.6
20.x        CSXS.7
21.x        CSXS.7
22.x        CSXS.8
23.x        CSXS.9
24.x        CSXS.9
25.x        CSXS.10
26.x        CSXS.11
27.x        CSXS.11
28.x        CSXS.11
29.x        CSXS.12
这才是版本号和CSXS号的真实对应关系,是安装所有版本以后查注册表整理出来的。
AI安装后,是没有CSXS号这个注册表项目的,只有启动一次并关闭以后,才会自动生成这个项,但是项目里面没有PlayerDebugMode这个值,所以我之前的做法是先启动AI,然后关闭,然后用for /f %%a in ('reg query "HKEY_CURRENT_USER\Software\Adobe" /f CSXS.*') do reg add "%%a" /v PlayerDebugMode /d 1 /f 2>nul来实现。这样要开关2次AI,虽然很勉强,总归是能用。想着如果是在AI启动前就把CSXS号项目给写入的话,就能不用启动2次AI,应该很难做到吧。
发表于 2025-9-6 15:17:47 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-9-6 15:54 编辑

回复 12# 剑气如霜

一。12楼给出的实际对应关系表(可存为列表文件以便后续维护)对于7楼代码构建的变量字典没有问题。
二。至于在ai安装前可否一次性在注册表中写入键值例如 reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe\csxs.9 /v PlayerDebugMode /t REG_SZ /d 1 /f 也没有问题(reg add 会自动创建路径中的新项如 csxs.9),只要用管理员身份(也可能不需要)且已知其中的项名如 csxs.9 即可,关键是后者。因此楼主须确认届时是否可知其中的项名如 csxs.9?
 楼主| 发表于 2025-9-6 16:12:21 | 显示全部楼层
回复 13# aloha20200628

所以这个问题应该是无解了,因为无法预知Adobe以后推出新版本的CSXS号,如果有规律还能猜测,没规律就只能手动录入,这样还不如我12楼写的办法,虽然要2次开启软件,但是能做到通用。不过说回来,这个帖子对于我还是有用的,让我初步了解到set /a的写法。谢谢大家!
发表于 2025-9-7 14:29:04 | 显示全部楼层
修改8#脚本,版本列表在脚本尾部。根据第一列版本值,将对应的第二列数据写入注册表。
顺便简化下for循环逻辑。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:06 , Processed in 0.036740 second(s), 14 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表