[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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 编辑 ]

我有点看不明白!有不过顶一下

TOP

用Xp SP3 里的reg.exe就可以了

TOP

  1. %userprofile%\documents
复制代码
可以不?

TOP

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

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

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

TOP

剛才有查了一下用法
  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的那個鍵值的名稱后,就可以用了,然後得到的結果作一下處理(截取得到的字符串的第三個數据,前面的東西的長度應該都是一樣的,所以只要刪掉前面的那些東西就可以得到結果了)

TOP

LS还没理解……

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

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

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


25,00,55,00,53,00
改为
002500550053
2位2位读取就可以了。汉字也一样。2位交换下就是其值

TOP

既然想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
复制代码

这个是通用的,不过需要一定的权限,既然是系统优化批处理权限应该不成问题的

TOP

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

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

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

TOP

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


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

TOP

?

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

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

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

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

要么更新reg
要么用别的语言吧。

TOP

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


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


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

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

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

TOP

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

TOP

回复 12楼 的帖子

XP以后的系统才有了reg.exe,win2k根本没有操作注册表键值的命令,你想用什么“技巧”来实现?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

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

返回列表