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

reg query查询注册表时中文路径会“吃掉”最后的字符

  头两天写了一个简单的查看开机自启动程序路径的代码[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 编辑 ]
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表