Board logo

标题: [注册表类] 【已解决】检测系统“我的文档”所在位置 [打印本页]

作者: 9zhmke    时间: 2009-2-1 05:07     标题: 【已解决】检测系统“我的文档”所在位置

我在做一个系统优化批处理,需要检测系统“我的文档”所在位置,一般会使用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 编辑 ]
作者: 心愿怕人    时间: 2009-2-1 09:07

我有点看不明白!有不过顶一下
作者: fastslz    时间: 2009-2-1 12:21

用Xp SP3 里的reg.exe就可以了
作者: sniperhgy    时间: 2009-2-1 12:54

  1. %userprofile%\documents
复制代码
可以不?
作者: 9zhmke    时间: 2009-2-1 14:18

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

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

[ 本帖最后由 9zhmke 于 2009-2-1 14:20 编辑 ]
作者: sniperhgy    时间: 2009-2-1 15:43

剛才有查了一下用法
  1. reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v 我的文檔的鍵值
复制代码
我用的vista系統,“我的文檔的鍵值”是personal所以我寫成
  1. reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Personal
复制代码
得到結果為
  1. D:\>reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Personal
  2. HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
  3.     Personal    REG_EXPAND_SZ    %USERPROFILE%\Documents
复制代码
樓主確定xp的那個鍵值的名稱后,就可以用了,然後得到的結果作一下處理(截取得到的字符串的第三個數据,前面的東西的長度應該都是一樣的,所以只要刪掉前面的那些東西就可以得到結果了)
作者: slore    时间: 2009-2-1 18:51

LS还没理解……

XP SP2的reg有问题。。。没考虑中文。

如果用户改变了这个路径并是个中文路径,那么reg返回的字符串长度会缺失。

hex注册表存储原则是 低位在前,高位在后。


25,00,55,00,53,00
改为
002500550053
2位2位读取就可以了。汉字也一样。2位交换下就是其值
作者: fastslz    时间: 2009-2-1 21:45

既然想xp 、2000、2003通用,2000连reg export也无法使用
  1. Set WS = WScript.CreateObject("WScript.Shell")
  2. strFullPath ="HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
  3. 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"
  4. aName = Split(strNames, ",")
  5. For i = 1 To UBound(aName)
  6. Wscript.Echo WS.RegRead(strFullPath & "\" & aName(i))
  7. Next
复制代码

这个是通用的,不过需要一定的权限,既然是系统优化批处理权限应该不成问题的
作者: 9zhmke    时间: 2009-2-1 22:25

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

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

[ 本帖最后由 9zhmke 于 2009-2-1 22:32 编辑 ]
作者: sniperhgy    时间: 2009-2-2 08:24

原帖由 9zhmke 于 2009-2-1 22:25 发表
fastslz的方法是不错,绕过了reg去读取,但这样务必会增加程序的复杂程序,而且估计一些杀软件今后也会对VB脚本有一定的拦截。
我还是想直接使用批处理来完成,看看还有没有什么方法可以解决?
slore的方法是可以, ...


請看一下我在6樓的回答,那個不會生成2進制的東西,而是直接一個字符串……
作者: slore    时间: 2009-2-2 12:56

?

比如我
在注册表读出来是:

hex(2)=11,62,00,00

11,62交换然后chrw。
MsgBox chrw( &H6211)

Chrw 返回与指定的 Unicode 字符代码相对应的字符。
的确是表是unicode 表。
所以bat不适合……

要么更新reg
要么用别的语言吧。
作者: 9zhmke    时间: 2009-2-2 14:26

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


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


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

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

[ 本帖最后由 9zhmke 于 2009-2-2 18:44 编辑 ]
作者: 9zhmke    时间: 2009-2-2 23:27

有没有办法使用代码页组合计算ascii码值,先申请个chr(n)=字母、数字、扩展字符表共255个,然后把chr按这个表弄出来呢?
作者: Batcher    时间: 2009-2-3 02:58     标题: 回复 12楼 的帖子

XP以后的系统才有了reg.exe,win2k根本没有操作注册表键值的命令,你想用什么“技巧”来实现?
作者: 9zhmke    时间: 2009-4-2 13:00

原帖由 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 编辑 ]
作者: Batcher    时间: 2009-4-2 13:04     标题: 回复 15楼 的帖子

BAT中怎样调用VBS并获取VBS的返回结果?
http://bbs.bathome.net/viewthread.php?tid=2187#pid12597




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