Board logo

标题: [注册表类] 【已解决】批处理的for语句中使用reg query出错 [打印本页]

作者: SmallK    时间: 2008-10-2 19:28     标题: 【已解决】批处理的for语句中使用reg query出错

在写某P的时候需要从注册表读取桌面文件夹的位置。单独的reg query语句一切正常,但将reg query语句嵌入到for中后所读取的数据就丢失了最后一个字符。测试代码如下:
  1. @echo off
  2. mode con: cols=50 lines=18
  3. color a
  4. for /f "skip=4 tokens=1,2 delims=:" %%a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v desktop') do (
  5.   set QQPathL=%%a
  6.   set QQPathR=%%b
  7. )
  8. echo 此时的^%%QQPathL^%%为:%QQPathL%
  9. echo 此时的^%%QQPathR^%%为:%QQPathR%
  10. pause
  11. set QQPath=%QQPathL:~-1%:%QQPathR%
  12. echo.&echo.&echo.&echo.
  13. echo       您桌面文件夹的位置为:
  14. echo       %QQPath%
  15. pause >nul
复制代码

作者: zqz0012005    时间: 2008-10-2 19:41

http://www.cn-dos.net/forum/viewthread.php?tid=21365#pid128521
经测试,确实是 Unicode 编码问题,与 reg 的操作参数 query 有关;而 reg 的 export 则无此问题。

      另外,reg query 的结果经过管道或者重定向后,含中文字符串的键值的尾部均有有所删减,删减的幅度为与串值中所有中文字的字数等同的字节数。这个问题与[1]中提到甚为相似。

      例如:
         1、测试:两个汉字,会删减尾部两个字节,得到:测
         2、测试test:两个汉字,会删减尾部两个字节,得到:测试te
         3、测试test结果:四个汉字,会删减尾部四个字节,得到:测试test
         4、键值名称为“测试”,数据为“测试test”时,过滤到的结果行为:“    测试        REG_S测试te”

[1]  [讨论]CMD自动完成特性对中文文件和目录名存在问题
http://www.cn-dos.net/forum/viewthread.php?tid=21091

作者: zqz0012005    时间: 2008-10-2 20:02

由于REG_EXPAND_SZ类型的数据导出后成了Hex(2)16进制形式,所以导出注册表的方法不行。
利用vbs
  1. @echo off
  2. echo wscript.echo CreateObject("WScript.Shell").RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\desktop") >t~.vbs
  3. for /f "delims=" %%a in ('cscript //nologo t~.vbs') do set "mydesk=%%a"
  4. echo %mydesk%
  5. del t~.vbs & echo. & pause
复制代码

作者: SmallK    时间: 2008-10-3 12:28

呵呵……先多谢zqz兄!
这两天比较忙,待我去测试一番再来~
作者: Batcher    时间: 2008-10-3 20:47     标题: reg query查询注册表时中文路径会“吃掉”最后的字符

原文地址:http://www.cn-dos.net/forum/viewthread.php?tid=22202
  头两天写了一个简单的查看开机自启动程序路径的代码[1],姑且不论查询得是否全面,在测试的过程中发现了一个十分头痛的问题:

  如果自启动程序的路径中含有N个中文字符的话(在注册表中的字符类型为REG_SZ,其他类型的字符暂未测试),那么,这个路径的最后N个字符(一个中文字符占用两个字符位)将被忽略掉,可能和中文的内码是双字节有关,具体的原因我也说不清楚。比如,在HKEY_Local_Machine\Software\Microsoft\Windows\CurrentVersion\Run下建立REG_SZ字符串test,值为 c:\program files\测试\test.exe ,那么,执行[1]的代码之后,test所在行显示为 c:\program files\测试\test.e ;如果上述值为 c:\program files\测试\再次测试.exe 的话,结果将显示 c:\program files\测试\再次测 。

  请问,这个问题该如何解决?
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. echo.
  4. echo                开机自启动的程序有:
  5. echo.
  6. for /f "skip=4 tokens=1* delims=:" %%i in ('reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Run') do (
  7.     set str=%%i
  8.     set var=%%j
  9.     set "var=!var:"=!"
  10.     if not "!var:~-1!"=="=" echo !str:~-1!:!var!
  11. )
  12. pause>nul
复制代码
XP SP2系统中的reg.exe有bug,当reg query遇到中文字符时可能会"吃字符"。

解决方案如下:
1. 用XP SP2以上的版本的操作系统(XP SP3/2003/Vista等)中的reg.exe来替换XP SP2的reg.exe
XP_SP3下的reg命令行程序下载地址:
http://bbs.bathome.net/thread-3692-1-1.html

2. 调用VBS读注册表,并把返回结果传递给BAT
  1. Set WshShell = Wscript.CreateObject("Wscript.Shell")
  2. tt=WshShell.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Start Menu") '' Read from value "Val"
  3. Wscript.echo tt
复制代码
3. 用reg export把注册表项导出到一个临时文件,再搜索该文件。

[ 本帖最后由 Batcher 于 2009-3-12 19:43 编辑 ]
作者: SmallK    时间: 2008-10-5 20:53     标题: 回复 5楼 的帖子

谢谢batcher兄!不过暂时没有条件,等我有时间了我花时间试一下。

[ 本帖最后由 SmallK 于 2008-10-10 02:54 编辑 ]




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