标题: [注册表类] 【已解决】批处理怎么读取注册表字符串值名称并只取两个不同的输出 [打印本页]
作者: 小智BAT 时间: 2014-10-5 12:04 标题: 【已解决】批处理怎么读取注册表字符串值名称并只取两个不同的输出
本帖最后由 小智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大神给出了输出一个的方法:- @echo off&setlocal enabledelayedexpansion
- set "s=V4用户认证"
- set "reg=reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders"
- set "find=findstr/i \\%s%\\.*REG_SZ
- for /f "tokens=*" %%i in ('%reg% 2^>nul^|%find%') do (
- set "var=%%i"
- set var=!var:\%s%\=\%s%^
-
- !
- for /f "delims=" %%a in ("!var!") do (
- if /i "%%~nxa" == "%s%" (
- if not defined a (set a=%%~dpa)else set b=%%~dpa
- )
- )
- )
- if not defined a (
- echo,没有%s%目录
- )else echo %a%&if defined b echo %b%
- pause
复制代码
感谢大神帮忙
感谢批处理论坛
作者: terse 时间: 2014-10-5 13:25
最后你可加个目录判断- @echo off
- set "s=vc"
- set "reg=reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders /f \%s%\ /t REG_SZ"
- set "find=findstr/ic:\\%s%\\"
- for /f "tokens=*" %%i in ('"%reg%|%find%"') do set str=%%~dpi
- if defined str (echo(%str%) else echo,没有安装%s%软件
- pause
复制代码
作者: 小智BAT 时间: 2014-10-5 13:38
回复 2# terse
你这个代码不行啊,vc是输出了,但是把vc改为wfo就一闪而过了。。。。。。是不是哪错了?而且这个查找路径定在C盘了,如果不是安装在C盘呢?
作者: terse 时间: 2014-10-5 13:50
本帖最后由 terse 于 2014-10-5 14:07 编辑
回复 3# 小智BAT
这个是查找注册表的 不是针对C盘的 既然vc可以 那会不会注册表里路径问题
是路径括号问题
变更下- @echo off
- set "s=WFOActives"
- set "reg=reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders /f \%s%\ /t REG_SZ"
- set "find=findstr/ic:\\%s%\\"
- for /f "tokens=*" %%i in ('"%reg%|%find%"') do (
- for /f "tokens=*" %%a in ("%%i\..") do if "%%~nxa" == "%s%" set "str=%%~fa\"
- )
- if not defined str (echo,没有安装%s%软件)else echo(%str%
- pause
复制代码
作者: 小智BAT 时间: 2014-10-5 14:00
回复 4# terse
发现一个问题,直接双击是可以,但是在iBAT里面调试出现
不知道什么原因。
作者: 小智BAT 时间: 2014-10-5 14:01
回复 4# terse
那该如何修改??
作者: terse 时间: 2014-10-5 14:09
本帖最后由 terse 于 2014-10-5 14:11 编辑
回复 6# 小智BAT
上面已修正 不知道是取最后含有 WFOActive 还是其他条件
错误提示 加个屏蔽吧 2>nul
作者: 小智BAT 时间: 2014-10-5 14:38
回复 7# terse
win7测试没问题了,可是xp下运行却出现
错误:命令行参数太多
作者: terse 时间: 2014-10-5 16:01
本帖最后由 terse 于 2014-10-5 17:27 编辑
回复 8# 小智BAT
XP- @echo off
- set "s=WFOActive"
- set "reg=reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders"
- set "find=findstr/ic:\\%s%\\
- for /f "tokens=*" %%i in ('%reg% 2^>nul^|%find%^|findstr/ic:REG_SZ') do (
- for /f "tokens=*" %%a in ("%%i\..") do if "%%~nxa" == "%s%" set "str=%%~fa\"
- )
- if not defined str (echo,没有安装%s%软件)else echo(%str%
- pause
复制代码
作者: 小智BAT 时间: 2014-10-5 16:08
回复 9# terse
xp下不行,说没找到安装软件。
作者: 小智BAT 时间: 2014-10-5 16:08
回复 9# terse
能不能一起兼容xp和win7的?
作者: terse 时间: 2014-10-5 17:22
本帖最后由 terse 于 2014-10-5 17:28 编辑
回复 10# 小智BAT
什么情况 刚刚xp 测试可以 现在WIN7也行
草 这里第三行 最后多个 S ...\Folderss"
作者: 小智BAT 时间: 2014-10-5 20:27
回复 12# terse
单单这个文件就行了,可是我套用进入我之前写的bat就不行了。提示显示没安装软件。但单但你命令就行,好奇怪啊。
作者: 小智BAT 时间: 2014-10-5 20:30
回复 12# terse
能不能换个写法,因为我复制文件到找到的目录的。
作者: Batcher 时间: 2014-10-5 20:32
回复 13# 小智BAT
完整代码发出来看看
作者: 小智BAT 时间: 2014-10-5 20:50
回复 15# Batcher
好奇怪,用iBAT调试时出错,双击运行没事,正常。不知道什么原因。
作者: 小智BAT 时间: 2014-10-6 01:16
本帖最后由 小智BAT 于 2014-10-6 01:31 编辑
回复 12# terse
你好,很感谢你为我解决问题,但现在我遇到一个问题就是我要输出的是前一个目录,该如何实现?
例如我安装目录改为d盘的文件夹时,字符串的值不再有WFOActive。但是有固定的“V4用户认证”,当我得到路径时那该如何返回上级目录并输出?
如得出C:\Program Files (x86)\WFOActive\V4用户认证\目录,我要的是上级目录C:\Program Files (x86)\WFOActive\,但这个目录是变动的
可也是D:\Program Files (x86)\WFOActive、也可以是F:\新建文件夹。求解决。
作者: terse 时间: 2014-10-6 10:48
本帖最后由 terse 于 2014-10-6 11:17 编辑
字符给吃了 换个方法试- @echo off&setlocal enabledelayedexpansion
- set "s=V4用户认证"
- set "reg=reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders"
- set "find=findstr/i \\%s%\\.*REG_SZ
- for /f "tokens=*" %%i in ('%reg% 2^>nul^|%find%') do (
- set "var=%%i"
- set var=!var:\%s%\=^
-
- !
- for /f "delims=" %%a in ("!var!") do if not defined str set "str=%%a"
- )
- if not defined str (echo,没有%s%目录)else echo,%str%
- pause
复制代码
作者: Batcher 时间: 2014-10-6 16:12
回复 16# 小智BAT
你把这个问题反馈给iBAT的作者看看吧
作者: 小智BAT 时间: 2014-10-7 07:48
回复 18# terse
你好,麻烦再解决下这个问题。非常感谢你。。。
如果注册表有字符串值
D:\新建文件夹\WFOActive
D:\新建文件夹\WFOActive\V4用户认证
C:\Program Files (x86)\WFOActive
C:\Program Files (x86)\WFOActive\V4用户认证
我要把“C:\Program Files (x86)\WFOActive\V4用户认证”和“D:\新建文件夹\WFOActive\V4用户认证”的上一级目录都输出,该怎么解决?
作者: terse 时间: 2014-10-7 19:13
本帖最后由 terse 于 2014-10-7 19:48 编辑
回复 20# 小智BAT - @echo off&setlocal enabledelayedexpansion
- set "s=V4用户认证"
- set "reg=reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders"
- set "find=findstr/i \\%s%\\.*REG_SZ
- for /f "tokens=*" %%i in ('%reg% 2^>nul^|%find%') do (
- set "var=%%i"
- set var=!var:\%s%\=\%s%^
-
- !
- for /f "delims=" %%a in ("!var!") do (
- if /i "%%~nxa" == "%s%" set /an+=1&set "$!n!=%%~dpa"
- )
- )
- if not defined n (echo,没有%s%目录)else for /l %%i in (1,1,!n!) do echo,!$%%i!
- pause
复制代码
作者: 小智BAT 时间: 2014-10-7 19:24
回复 21# terse
是可以输出了。那该如何取得它们的上一级目录呢?
作者: 小智BAT 时间: 2014-10-7 19:41
回复 21# terse
能不能把两显示的分别以
echo %a%
echo %b%
显示吗,因为我要定义set waya=%a% set wayb=%b%
这个可以现实吗?
作者: terse 时间: 2014-10-7 19:49
回复 23# 小智BAT
你举例2个变量 如果是三个或三个以上呢 上面修正为 $1 - $n
作者: 小智BAT 时间: 2014-10-7 19:56
回复 24# terse
最多两个,一般不会有第三个变量出现,能不能定义为:a ,b分别输出啊?
我是小白,不会拆分你的代码。。。。
作者: 小智BAT 时间: 2014-10-7 20:13
回复 24# terse
如果是多个是可以定义为way1=,way2,way3.。。。。。
可以这样的吗?不过我着一般只是出现2个,不会有第三个的。
作者: 小智BAT 时间: 2014-10-7 20:29
回复 24# terse
已经确定是两个变量了。不会存在第三个了,请大神给个再给个方案。万分感谢!!
作者: terse 时间: 2014-10-7 21:01
回复 27# 小智BAT - @echo off&setlocal enabledelayedexpansion
- set "s=V4用户认证"
- set "reg=reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\Folders"
- set "find=findstr/i \\%s%\\.*REG_SZ
- for /f "tokens=*" %%i in ('%reg% 2^>nul^|%find%') do (
- set "var=%%i"
- set var=!var:\%s%\=\%s%^
-
- !
- for /f "delims=" %%a in ("!var!") do (
- if /i "%%~nxa" == "%s%" (
- if not defined a (set a=%%~dpa)else set b=%%~dpa
- )
- )
- )
- if not defined a (
- echo,没有%s%目录
- )else echo %a%&if defined b echo %b%
- pause
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |