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

[注册表类] 【已解决】批处理怎么读取注册表字符串值名称并只取两个不同的输出

[复制链接]
发表于 2014-10-5 12:04:44 | 显示全部楼层 |阅读模式
本帖最后由 小智BAT 于 2014-10-8 09:00 编辑

我想通过注册表查找
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders中的字符串值名称是否包含WFOActive
并输出该完整的字符串值名称,其中字符串值名称有多个包含“WFOActive”
如有多个字符串值名称如下:
C:\Program Files (x86)\WFOActive\V4用户认证\
E:\V5认证\WFOActive\V4用户认证\
E:\V5认证\WFOActive\
C:\Program Files (x86)\WFOActive\
我需要输出“C:\Program Files (x86)\WFOActive\”和“E:\V5认证\WFOActive\”上一级目录就好,其他不要输出。如何解决?
如果没有找到则提示没有安装该软件。

注意:如果安装在d盘,其字符串值名称会改为d盘的路径名称。

terse大神给出了输出一个的方法:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "s=V4用户认证"
  3. set "reg=reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders"
  4. set "find=findstr/i \\%s%\\.*REG_SZ
  5. for /f "tokens=*" %%i in ('%reg% 2^>nul^|%find%') do (
  6.     set "var=%%i"
  7.     set var=!var:\%s%\=\%s%^

  8. !
  9.     for /f "delims=" %%a in ("!var!") do (
  10.         if /i "%%~nxa" == "%s%" (
  11.            if not defined a (set a=%%~dpa)else set b=%%~dpa
  12.         )
  13.     )
  14. )
  15. if not defined a (
  16.    echo,没有%s%目录
  17. )else echo %a%&if defined b echo %b%
  18. pause
复制代码
感谢大神帮忙
感谢批处理论坛
发表于 2014-10-5 13:25:10 | 显示全部楼层
最后你可加个目录判断
  1. @echo off
  2. set "s=vc"
  3. set "reg=reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders /f \%s%\ /t REG_SZ"
  4. set "find=findstr/ic:\\%s%\"
  5. for /f "tokens=*" %%i in ('"%reg%|%find%"') do set str=%%~dpi
  6. if defined str (echo(%str%) else echo,没有安装%s%软件
  7. pause
复制代码
 楼主| 发表于 2014-10-5 13:38:09 | 显示全部楼层
回复 2# terse

你这个代码不行啊,vc是输出了,但是把vc改为wfo就一闪而过了。。。。。。是不是哪错了?而且这个查找路径定在C盘了,如果不是安装在C盘呢?
发表于 2014-10-5 13:50:11 | 显示全部楼层
本帖最后由 terse 于 2014-10-5 14:07 编辑

回复 3# 小智BAT
这个是查找注册表的 不是针对C盘的  既然vc可以 那会不会注册表里路径问题
是路径括号问题
变更下
  1. @echo off
  2. set "s=WFOActives"
  3. set "reg=reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders /f \%s%\ /t REG_SZ"
  4. set "find=findstr/ic:\\%s%\"
  5. for /f "tokens=*" %%i in ('"%reg%|%find%"') do (
  6.     for /f "tokens=*" %%a in ("%%i\..") do if "%%~nxa" == "%s%" set "str=%%~fa"
  7. )
  8. if not defined str (echo,没有安装%s%软件)else echo(%str%
  9. pause
复制代码
 楼主| 发表于 2014-10-5 14:00:15 | 显示全部楼层
回复 4# terse


  发现一个问题,直接双击是可以,但是在iBAT里面调试出现

不知道什么原因。
 楼主| 发表于 2014-10-5 14:01:55 | 显示全部楼层
回复 4# terse


    那该如何修改??
发表于 2014-10-5 14:09:26 | 显示全部楼层
本帖最后由 terse 于 2014-10-5 14:11 编辑

回复 6# 小智BAT
上面已修正 不知道是取最后含有 WFOActive 还是其他条件
错误提示 加个屏蔽吧  2>nul
 楼主| 发表于 2014-10-5 14:38:06 | 显示全部楼层
回复 7# terse


    win7测试没问题了,可是xp下运行却出现
错误:命令行参数太多
发表于 2014-10-5 16:01:38 | 显示全部楼层
本帖最后由 terse 于 2014-10-5 17:27 编辑

回复 8# 小智BAT
XP
  1. @echo off
  2. set "s=WFOActive"
  3. set "reg=reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders"
  4. set "find=findstr/ic:\\%s%\\
  5. for /f "tokens=*" %%i in ('%reg% 2^>nul^|%find%^|findstr/ic:REG_SZ') do (
  6.     for /f "tokens=*" %%a in ("%%i\..") do if "%%~nxa" == "%s%" set "str=%%~fa"
  7. )
  8. if not defined str (echo,没有安装%s%软件)else echo(%str%
  9. pause
复制代码
 楼主| 发表于 2014-10-5 16:08:04 | 显示全部楼层
回复 9# terse


    xp下不行,说没找到安装软件。
 楼主| 发表于 2014-10-5 16:08:43 | 显示全部楼层
回复 9# terse


    能不能一起兼容xp和win7的?
发表于 2014-10-5 17:22:54 | 显示全部楼层
本帖最后由 terse 于 2014-10-5 17:28 编辑

回复 10# 小智BAT
什么情况 刚刚xp 测试可以 现在WIN7也行

草 这里第三行 最后多个 S   ...\Folderss"
 楼主| 发表于 2014-10-5 20:27:47 | 显示全部楼层
回复 12# terse


   单单这个文件就行了,可是我套用进入我之前写的bat就不行了。提示显示没安装软件。但单但你命令就行,好奇怪啊。
 楼主| 发表于 2014-10-5 20:30:18 | 显示全部楼层
回复 12# terse


    能不能换个写法,因为我复制文件到找到的目录的。
发表于 2014-10-5 20:32:19 | 显示全部楼层
回复 13# 小智BAT


    完整代码发出来看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-21 00:28 , Processed in 0.033472 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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