中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]从注册表项中获取中文键值的问题
作者:
标题: [已结]从注册表项中获取中文键值的问题 取消高亮 | 上一主题 | 下一主题
donpps
初级用户





积分 56
发帖 20
注册 2006-4-23
状态 离线
『楼 主』:  [已结]从注册表项中获取中文键值的问题

@echo off
echo 请教如何在WinXP控制台环境,使用批处理,从注册表项中获取中文目录
echo.
echo 譬如在 hklm\software\basesoft\kingbasees\4.1 下,有项为:Data,其值为:D:\Program Files\KingbaseES\Data
echo 又如在 hklm\software\basesoft\kingbasees\4.1 下,有项为:Home,其值为:D:\中国农作物有害生物监测信息系统(离线版)\KingbaseES
echo.
echo 问题是如何提取注册表项值,赋与环境变量。以下为我的方法及结果。
for /f "tokens=2*" %%i in ('reg query hklm\software\basesoft\kingbasees\4.1 /v Data ^| find /i "Data"') do set old_king_path=%%j
for /f "tokens=2*" %%i in ('reg query hklm\software\basesoft\kingbasees\4.1 /v Home ^| find /i "Home"') do set old_nyb_path=%%j
rem  结果如下
echo.
echo %old_king_path%
echo %old_nyb_path%
echo.
echo 显然在注册表项值包含较长的中文串时,不能成功赋值,譬如 %%old_nyb_path%% 只能显示部分项值形如:D:\中国农作物有害生物监测信息系统?
echo 敬请不吝指教。
pause >nul

[ Last edited by willsort on 2006-6-23 at 12:48 ]

2006-6-19 12:46
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
donpps
初级用户





积分 56
发帖 20
注册 2006-4-23
状态 离线
『第 2 楼』:  

看样子牵涉到 unicode 编码问题,比较难解决。没有别的好办法吗!

2006-6-21 11:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
donpps
初级用户





积分 56
发帖 20
注册 2006-4-23
状态 离线
『第 3 楼』:  

最终用 regedit /e 导出,再用 for,find 等命令解决问题。

2006-6-22 18:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 4 楼』:  

Re donpps:

      经测试,确实是 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

[ Last edited by willsort on 2006-6-23 at 12:46 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-23 12:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 5 楼』:  


───────────────── 版务记录 ─────────────────
执行:Will Sort
操作:移动主题:自 DOS疑難解答 & 問題討論(解答室)
说明:依照主题内容分类,更适合于发表在此版区
───────────────── 版务记录 ─────────────────




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-23 12:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
donpps
初级用户





积分 56
发帖 20
注册 2006-4-23
状态 离线
『第 6 楼』:  

谢谢解答!

2006-6-27 09:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
donpps
初级用户





积分 56
发帖 20
注册 2006-4-23
状态 离线
『第 7 楼』:  最终方法

@echo off
:: 批处理
reg export "HKEY_LOCAL_MACHINE\SOFTWARE\basesoft\kingbasees\4.1" kingbase.reg
for /f "tokens=2 delims==" %%a in ('type kingbase.reg ^| find "home" /i') do set old_nyb_path=%%~fa
del kingbase.reg

2006-6-27 10:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
holyman
初级用户





积分 42
发帖 20
注册 2006-10-24
状态 离线
『第 8 楼』:  

谢谢,有收获

2006-10-25 01:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 9 楼』:  



  Quote:
Originally posted by donpps at 2006-6-27 10:43:
@echo off
:: 批处理
reg export "HKEY_LOCAL_MACHINE\SOFTWARE\basesoft\kingbasees\4.1" kingbase.reg
for /f "tokens=2 delims==" %%a in ('type kingbase.reg ^| find "home& ...


  对此批处理中的"%%~fa",我个人感到比较怀疑,为什么我会这么说呢?

  1、"~f"变量扩展,我认为只针对一个硬盘上存在的文件而言的,这个变量扩展非常适于用"dir /s/b/a-d"+"for /f"语句来寻找一个文件的完整路径,而上面的代码提取到的虽然是一个"路径",但只能看成是一个"字符串",因为他是从文本文件"kingbase.reg"里面提取的"字符",所以鄙人认为这里不必用~f变量扩展来扩展提取到的所谓的"路径"。

  2、直接用一个变量取代就可以了。set paths=%%a就可以了,相反,用了%%~f,我个人感觉还比较容易出错。

  以上只是对这个批处理的质疑之处,具体到底有没有必要用到扩展,还没有深究。


2006-10-25 09:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by lxmxn at 2006-10-25 09:19:

1、"~f"变量扩展,我认为只针对一个硬盘上存在的文件而言的,...

  
  实际上,for的变量扩展是十分机械的,它并不会去检查这个路径是否存在,而是简单的对提取到的字符串做扩展操作,只要这个字符串符合 盘符+冒号+斜杠+文件夹名[+文件名+扩展名] 的格式([]内的内容可选)。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-10-25 11:41
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 11 楼』:  


  版主的意思还是不太明白,可否再讲清楚一点?
  
  我是这么怀疑的:
    如果提取到的只是一个字符串,比如chinados,那么%%~f怎么去匹配这个chinados???


2006-10-25 11:46
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 12 楼』:  

  你测试一下下面的代码就清楚怎么回事了:
@echo off
set a=c:\test\d\nofind\5.txt
for %%i in (%a%) do echo %%~pi
pause




尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-10-25 11:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 13 楼』:  


  汗一个先。

  这个已经指定了完整路径,当然可以扩展到路径了,我的意思是怎么从提取到的一个字符串来扩展到它的完整路径?

  如果我提的这个要求不能满足,那么请仔细分析一下上面F7的代码是否有不当之处。尤其是那个%%~fa。


2006-10-25 12:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 14 楼』:  

  sorry,我看得粗心,理解偏了。其实我想表达的意思是:for语句中,对字符串的扩展操作能否成功,和这个路径是否存在并没有任何关系,只要这个字符串的格式符合路径的格式就行了。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-10-25 12:23
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: