标题: [注册表类] 批处理怎么用REG QUERY准确读取注册表? [打印本页]
作者: windeshadow 时间: 2011-10-31 12:00 标题: 批处理怎么用REG QUERY准确读取注册表?
比如我用REG QUERY HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\测试
得出以下结果
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\测试
Inno Setup: Setup Version REG_SZ 5.3.10.ee2 (a)
Inno Setup: App Path REG_SZ C:\DIY
InstallLocation REG_SZ "C:\DIY\LOG"
我想将结果中的名称和值都准确的读取出来
但是名称中有空格,值中也有空格和引号
下面是我写的部分代码
当值中没有引号或者其他特殊符号的时候是可以读取的
有引号的时候就会出错,怎么解决这个问题呢- :ReadRegValue
- ::St WinXP、Win7注册表读取(20111016)
- ::IE版本
- CALL :ReadRegValueName "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer" "Version"
- ::文件夹路径
- CALL :ReadRegValueName "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
- CALL :ReadRegValueName "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
- GOTO :EOF
-
- :ReadRegValueName
- IF "%~1"=="" (GOTO :EOF) ELSE (IF "%~2"=="" (SET KeyName="%~1") ELSE (SET KeyName="%~1" /v "%~2"))
- ::WinXP skip=4,Win7 skip=2
- FOR /F "skip=2 tokens=*" %%i In ('reg query %KeyName%') Do (CALL :SeparationRegValue "%%i")
- GOTO :EOF
-
- :SeparationRegValue
- IF "%~1"=="" GOTO :EOF
- SET RegValue=Initial&SET RegValueName=Initial&SET RegData=Initial
- SET RegValue=%~1
- IF "%RegValue%"=="Initial" GOTO :EOF
-
- SET "RegValue=%RegValue:REG_SZ=∷%"
- SET "RegValue=%RegValue:REG_MULTI_SZ=∷%"
- SET "RegValue=%RegValue:REG_DWORD_BIG_ENDIAN=∷%"
- SET "RegValue=%RegValue:REG_DWORD=∷%"
- SET "RegValue=%RegValue:REG_BINARY=∷%"
- SET "RegValue=%RegValue:REG_DWORD_LITTLE_ENDIAN=∷%"
- SET "RegValue=%RegValue:REG_NONE=∷%"
- SET "RegValue=%RegValue:REG_EXPAND_SZ=∷%"
- FOR /F "tokens=1,2* delims=∷" %%i In ("%RegValue%") Do (SET RegValueName=%%i&SET RegData=%%j)
- IF "%RegData%"=="" GOTO :EOF
- :DelSpace
- ::WinXP Reg空格(TAB)
- IF "%RegValueName:~-1%"==" " (SET RegValueName=%RegValueName:~0,-1%&GOTO DelSpace)
- IF "%RegData:~,1%"==" " (SET RegData=%RegData:~1%&GOTO DelSpace)
- ::Win7 Reg空格
- IF "%RegValueName:~-1%"==" " (SET RegValueName=%RegValueName:~0,-1%&GOTO DelSpace)
- IF "%RegData:~,1%"==" " (SET RegData=%RegData:~1%&GOTO DelSpace)
-
- SET %RegValueName%=%RegData%
- @echo ----------------------------------------------
- @echo %RegValueName%=%RegData%
- GOTO :EOF
- ::----------------------------------------------
复制代码
作者: awk 时间: 2011-10-31 22:08
- reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\测试 | gawk -F "REG_SZ|REG_DWORD|REG_EXPAND_SZ" "{print $1; print $2}"
复制代码
作者: bluewing009 时间: 2011-11-1 08:35
不用第三方:
把REG_替换成一个特殊字符,然后利用for /f delims取,这样取得关键字和空格
然后对这个字符串处理:
方法1:利用偏移,对最后一个字符判断是否为空
方法2:tokens=1*这样能取第一个空格前的字符,然后把剩下的重新传递再取下一个空格前的字符串,直至取完
说明:好像记得字符串 REG_SZ中间空格是确定的,7和xp不同,这样能直接用偏移……
作者: windeshadow 时间: 2011-11-1 10:22
方法1:利用偏移,对最后一个字符判断是否为空
这个方法 判断的时候会出错
如果不加引号比如
IF %RegData%==啊 goto NO
这是没有引号的,%RegData%为空的时候但明显会出错
通常我判断是两边都加引号
IF "%RegData:~,1%"==" " goto NO
或者
IF "%RegData%"==" " goto NO
缺点是%RegData%中有引号的时候都会出错
我现在用的方法就是替换“ REG_SZ”为某个字符串
然后取2边的 但我要判断REG_SZ 后面是不是空值呀
作者: tiandyoin 时间: 2023-10-6 10:37
我正在研究像下面这样有迷惑性的数据,该如何处理?下面是查询内容,两者一模一样,无法区分的,- >reg query "HKEY_CURRENT_USER\1\[Mouse without Borders]2"
-
- HKEY_CURRENT_USER\1\[Mouse without Borders]2
- Mouse without Borders"= REG_SZ 134 REG_SZ 134 REG_SZ DATA1"DATA2
- Mouse without Borders"= REG_SZ 134 REG_SZ 134 REG_SZ DATA1"DATA2
复制代码
回复 4# windeshadow
下面的 reg query 的导出内容,如何加上 /Z 选项,要处理差异,似乎也非常麻烦?- [HKEY_CURRENT_USER\1\[Mouse without Borders]2]
- "Mouse without Borders\"="="134 REG_SZ 134 REG_SZ DATA1\"DATA2"
- "Mouse without Borders\"= REG_SZ 134"="134 REG_SZ DATA1\"DATA2"
复制代码
作者: Nsqs 时间: 2023-10-7 05:04
用PowerShell 数据一目了然,简单实用- #PowerShell
- dir Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\测试
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |