Board logo

标题: [注册表类] 请教批处理如何搜索一个注册表的键值作为一个变量? [打印本页]

作者: wxl42640211    时间: 2015-2-16 10:59     标题: 请教批处理如何搜索一个注册表的键值作为一个变量?

是这样的,我的目的是获取某个MSI包的 GUID值,这个MSI会经常更新,所以GUID值会变,但是这个MSI包的DisplayName是固定的而且是唯一的,所以想通过搜索DisplayName确定这个MSI包所在注册表的具体路径,然后找到这个路径下键位UninstallString的值(也就是GUID),并将其设置为变量

MSI包在注册表下HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ ,但无法确定具体路径
我需要在这个路径下 搜索到一个名为Displayname的键,其值为“21413181” ,这样就可以确定了MSI包的具体路径,比如应该是HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ {FA8AS8-AS7ASD-ASDSADA}
那么接下来在上面这个路径下 ,找出UninstallString的键值,并设置为变量就算成功了

有哪位高手能帮帮我吗?真的很急需啊,好人一生平安~~~~~~~~~~~~~~
作者: apang    时间: 2015-2-16 14:00

本帖最后由 apang 于 2015-2-17 17:29 编辑
  1. @echo off
  2. set "s1=DisplayName"
  3. set "s2=21413181"
  4. set "s3=UninstallString"
  5. set "k=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
  6. for /f "delims=" %%i in ('reg query "%k%" /s^|findstr /ib HKEY') do (
  7.         set "flag=" & set "var="
  8.         for /f "tokens=1,2*" %%a in ('reg query "%%i"') do (
  9.                 if /i "%%a.%%c" == "%s1%.%s2%" set "flag=1"
  10.                 if /i "%%a" == "%s3%" set "var=%%c"
  11.         )
  12.         if defined flag if defined var goto :Next
  13. )
  14. pause & exit/b
  15. :Next
  16. echo,%var%
  17. pause
复制代码

作者: apang    时间: 2015-2-16 14:20

本帖最后由 apang 于 2015-2-28 10:21 编辑
  1. @set @n=0;/* & echo off
  2. set "k=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
  3. set "Js=cscript -nologo -e:jscript"
  4. for /f "tokens=2*" %%a in ('reg query %k% /s^|%Js% "%~0"') do set "var=%%b"
  5. echo,%var%
  6. pause & exit/b */
  7. txt = WScript.StdIn.ReadAll() + "\r\nHKEY";
  8. re = /^HKEY[\s\S]+?(?=^HKEY)/img;
  9. while ((arr=re.exec(txt)) != null) {
  10.         a = arr[0].match(/\bDisplayName\b +REG_SZ +(.*)\r\n/i);
  11.         b = arr[0].match(/\bUninstallString\b.*\n/i);
  12.         if (a && b) {
  13.                 if (a[1] == "Wolves (Application Proxy)") {
  14.                         WScript.Echo(b[0]); break
  15.                 }
  16.         }
  17. }
复制代码
WinXP系统中,reg query 得到的结果与Win7有所不同
WinXP:注册表值、类型、数据之间以Tab分割(即DisplayName与REG_SZ之间以Tab分割)
Win7:注册表值、类型、数据之间以空格分割
第11行改成:
  1. a = arr[0].match(/\bDisplayName\s+REG_SZ\s+(.*)\r\n/i);
复制代码
可两者兼顾
作者: wxl42640211    时间: 2015-2-16 14:25

apang 发表于 2015-2-16 14:20



    哇塞,大神你太厉害了,我这就去试试
作者: wxl42640211    时间: 2015-2-16 15:12

回复 3# apang


    请问大神,关键字21413181 这个  如果想换成带有空格和括号的 应该如何填写呢?  比如换成 Wolves (Application Proxy)
作者: apang    时间: 2015-2-16 15:46

本帖最后由 apang 于 2015-2-16 15:48 编辑

回复 5# wxl42640211


    3#已修改,直接修改第15行字串值(注意大小写)
作者: wxl42640211    时间: 2015-2-16 16:51

回复 6# apang


    谢谢大神
作者: yiwuyun    时间: 2015-2-16 23:24

回复 3# apang
第13行怎么不用第12行一样的写法,直接就找出,而偏偏要把整行找出喃。没测试,不晓得对否.
作者: apang    时间: 2015-2-17 17:19

回复 8# yiwuyun


    是的,匹配子项也可以的。
按照楼主的意图,无论是匹配整行,还是匹配子项,最后都得交给for来赋值var
貌似匹配整行要简单那么一丁点




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2