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

[注册表类] 【已解决】检测系统“我的文档”所在位置

我在做一个系统优化批处理,需要检测系统“我的文档”所在位置,一般会使用reg查询法,但取出的字符如果是中文在某些系统下会被吃掉一半,所以改用更加稳妥的方法:
reg export "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" d:\temp.tmp >nul
但这样做生成的文件却是HEX代码,如:
"Recent"=hex(2):25,00,55,00,53,00,45,00,52,00,50,00,52,00,4f,00,46,00,49,00,4c,\
  00,45,00,25,00,5c,00,52,00,65,00,63,00,65,00,6e,00,74,00,00,00
"SendTo"=hex(2):25,00,55,00,53,00,45,00,52,00,50,00,52,00,4f,00,46,00,49,00,4c,\
  00,45,00,25,00,5c,00,53,00,65,00,6e,00,64,00,54,00,6f,00,00,00
这些代码经取出后,需要还原为字符串,如果是英文字母还好办,可以使用数组来解决,但如果是汉字就会很麻烦,怎么把这些hex字串转成ASCII码字符串呢?

[ 本帖最后由 9zhmke 于 2009-4-2 13:06 编辑 ]

用SP3里的reg替换只适用于xp sp2,对2000、2003或其它的版本不一定适用,起码对2000是肯定不行的。
sniperhgy说的方法仅适用于没有改动的系统,有些系统已经改动了这个位置,我要实现的是准确地找到这个位置。可能难度比较大。

从注册表里取位置肯定是准确的,从十六进制改成字符串肯定是很好的方法,但怎么能实现把这些hex转过来呢?

[ 本帖最后由 9zhmke 于 2009-2-1 14:20 编辑 ]

TOP

fastslz的方法是不错,绕过了reg去读取,但这样务必会增加程序的复杂程序,而且估计一些杀软件今后也会对VB脚本有一定的拦截。
我还是想直接使用批处理来完成,看看还有没有什么方法可以解决?
slore的方法是可以,但取内容容易,怎么把取出的代码还原为chr字符串呢? 我主要是用于取“我的文档”和“桌面”、“收藏夹”这三个地方。

对英文字母比较容易,大不了就做个字库对应比如用 chr65来放“A”,用chr97来放“a”,但汉字那么多,怎么做成汉字呢?大于160组合为汉字,chr161,chr161组合起来是“啊”字,不可能还要做个字库对应表吧?肯定有什么办法可以实现,但我脑袋想烂了都没想到方法。其实这个总是困扰我很久了,多年前就为这事想了很久,没找到合适的办法。

[ 本帖最后由 9zhmke 于 2009-2-1 22:32 编辑 ]

TOP

原帖由 sniperhgy 于 2009-2-2 08:24 发表


請看一下我在6樓的回答,那個不會生成2進制的東西,而是直接一個字符串……


请参考7楼回答,谢谢回答。

如果可以使用某个技巧来实现

[ 本帖最后由 9zhmke 于 2009-2-2 18:44 编辑 ]

TOP

有没有办法使用代码页组合计算ascii码值,先申请个chr(n)=字母、数字、扩展字符表共255个,然后把chr按这个表弄出来呢?

TOP

原帖由 fastslz 于 2009-2-1 21:45 发表
既然想xp 、2000、2003通用,...VBS:

Set WS = WScript.CreateObject("WScript.Shell")
strFullPath ="HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
strNames = "AppData,Desktop,Favorites,NetHood,Personal,PrintHood,Programs,Recent,SendTo,Start Menu,Startup,Templates,My Pictures,Local Settings,Local AppData,Cache,History,My Music,Cookies"
aName = Split(strNames, ",")
For i = 1 To UBound(aName)
Wscript.Echo WS.RegRead(strFullPath & "\" & aName(i))
Next


这么久了我也没想出一个万全之法,还是用VBS吧,用for语句来读取结果。

[ 本帖最后由 9zhmke 于 2009-4-2 13:05 编辑 ]

TOP

返回列表