[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[注册表类] 批处理怎么用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"

我想将结果中的名称和值都准确的读取出来
但是名称中有空格,值中也有空格和引号

下面是我写的部分代码
当值中没有引号或者其他特殊符号的时候是可以读取的
有引号的时候就会出错,怎么解决这个问题呢
  1. :ReadRegValue
  2. ::St WinXP、Win7注册表读取(20111016)
  3. ::IE版本
  4. CALL :ReadRegValueName "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer" "Version"
  5. ::文件夹路径
  6. CALL :ReadRegValueName "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
  7. CALL :ReadRegValueName "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
  8. GOTO :EOF
  9. :ReadRegValueName
  10. IF "%~1"=="" (GOTO :EOF) ELSE (IF "%~2"=="" (SET KeyName="%~1") ELSE (SET KeyName="%~1" /v "%~2"))
  11. ::WinXP skip=4,Win7 skip=2
  12. FOR /F "skip=2 tokens=*" %%i In ('reg query %KeyName%') Do (CALL :SeparationRegValue "%%i")
  13. GOTO :EOF
  14. :SeparationRegValue
  15. IF "%~1"=="" GOTO :EOF
  16. SET RegValue=Initial&SET RegValueName=Initial&SET RegData=Initial
  17. SET RegValue=%~1
  18. IF "%RegValue%"=="Initial" GOTO :EOF
  19. SET "RegValue=%RegValue:REG_SZ=∷%"
  20. SET "RegValue=%RegValue:REG_MULTI_SZ=∷%"
  21. SET "RegValue=%RegValue:REG_DWORD_BIG_ENDIAN=∷%"
  22. SET "RegValue=%RegValue:REG_DWORD=∷%"
  23. SET "RegValue=%RegValue:REG_BINARY=∷%"
  24. SET "RegValue=%RegValue:REG_DWORD_LITTLE_ENDIAN=∷%"
  25. SET "RegValue=%RegValue:REG_NONE=∷%"
  26. SET "RegValue=%RegValue:REG_EXPAND_SZ=∷%"
  27. FOR /F "tokens=1,2* delims=∷" %%i In ("%RegValue%") Do (SET RegValueName=%%i&SET RegData=%%j)
  28. IF "%RegData%"=="" GOTO :EOF
  29. :DelSpace
  30. ::WinXP Reg空格(TAB)
  31. IF "%RegValueName:~-1%"==" " (SET RegValueName=%RegValueName:~0,-1%&GOTO DelSpace)
  32. IF "%RegData:~,1%"==" " (SET RegData=%RegData:~1%&GOTO DelSpace)
  33. ::Win7 Reg空格
  34. IF "%RegValueName:~-1%"==" " (SET RegValueName=%RegValueName:~0,-1%&GOTO DelSpace)
  35. IF "%RegData:~,1%"==" " (SET RegData=%RegData:~1%&GOTO DelSpace)
  36. SET %RegValueName%=%RegData%
  37. @echo ----------------------------------------------
  38. @echo %RegValueName%=%RegData%
  39. GOTO :EOF
  40. ::----------------------------------------------
复制代码

用PowerShell 数据一目了然,简单实用
  1. #PowerShell
  2. dir Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\测试
复制代码

TOP

我正在研究像下面这样有迷惑性的数据,该如何处理?下面是查询内容,两者一模一样,无法区分的,
  1. >reg query "HKEY_CURRENT_USER\1\[Mouse without Borders]2"
  2. HKEY_CURRENT_USER\1\[Mouse without Borders]2
  3.     Mouse without Borders"=    REG_SZ    134    REG_SZ    134    REG_SZ    DATA1"DATA2
  4.     Mouse without Borders"=    REG_SZ    134    REG_SZ    134    REG_SZ    DATA1"DATA2
复制代码
回复 4# windeshadow

下面的 reg query 的导出内容,如何加上 /Z 选项,要处理差异,似乎也非常麻烦?
  1. [HKEY_CURRENT_USER\1\[Mouse without Borders]2]
  2. "Mouse without Borders\"="="134    REG_SZ    134    REG_SZ    DATA1\"DATA2"
  3. "Mouse without Borders\"=    REG_SZ    134"="134    REG_SZ    DATA1\"DATA2"
复制代码

TOP

方法1:利用偏移,对最后一个字符判断是否为空
这个方法 判断的时候会出错
如果不加引号比如
IF %RegData%==啊 goto NO
这是没有引号的,%RegData%为空的时候但明显会出错
通常我判断是两边都加引号
IF "%RegData:~,1%"==" " goto NO
或者
IF "%RegData%"==" " goto NO
缺点是%RegData%中有引号的时候都会出错


我现在用的方法就是替换“ REG_SZ”为某个字符串
然后取2边的  但我要判断REG_SZ 后面是不是空值呀

TOP

不用第三方:
把REG_替换成一个特殊字符,然后利用for /f delims取,这样取得关键字和空格
然后对这个字符串处理:
方法1:利用偏移,对最后一个字符判断是否为空
方法2:tokens=1*这样能取第一个空格前的字符,然后把剩下的重新传递再取下一个空格前的字符串,直至取完
说明:好像记得字符串  REG_SZ中间空格是确定的,7和xp不同,这样能直接用偏移……

TOP

  1. reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\测试 | gawk -F "REG_SZ|REG_DWORD|REG_EXPAND_SZ" "{print $1; print $2}"
复制代码

TOP

返回列表