![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-17 20:26 |
共 47,814 主题排行 / 349,907 发帖 / 今日 4 篇 / 48,259 会员排行 |
| DOS疑难解答 & 问题讨论 (解答室) » [求助]XP下如何将注册表指定键值导出到指定变量做路径? |
| 可打印版本 1,240 / 9 |
| 第1楼 pillow | 发表于 2005-12-09 11:23 |
| 初级用户 发帖 82 积分 196 | |
|
[求助]XP下如何将注册表指定键值导出到指定变量做路径? 我想将
Windows Registry Editor Version 5.00 "Start Menu"="C:\\Documents and Settings\\pillow_zhu\\Start Menu" 中的C:\\Documents and Settings\\pillow_zhu\\Start Menu 导出到变量path1中, 用于之后的批处理程序,比如 copy test.bat %path1%\ 我只知道regedit一般可以导出某个键,却不知道如何把这个值赋给path1, 希望哪们达人指点一下,谢谢! [ Last edited by pillow on 2005-12-14 at 11:26 ] |
|
| 第2楼 Climbing | 发表于 2005-12-10 12:35 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
导出注册表某个键值,可以使用reg query命令,当然,同样也可以使用regedit。
但要将某个键值放到环境变量中就实在不是一件容易的事情,尤其在这个键及其值中含有空格等情况下,更是困难。 如果你的样例就限制在前述的条件下(即出注册表中的Start Menu键值到path1变量中),可以使用下列命令: ... regedit /e shellf.reg "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" type shellf.reg | find "Start Menu" > ~tmp.txt FOR /F "delims== tokens=1,2*" %%i in (~tmp.txt) do @set path1=%j :: 现在path1变量中已经包括了Start Menu的值 copy test.bat %path1% |
|
| 第3楼 pillow | 发表于 2005-12-12 11:14 |
| 初级用户 发帖 82 积分 196 | |
|
哇,帅呆啦!这也是个我想了好久的问题呢!
现在终于得解了! 果然是高人非常! 知识点固然学到,但方法和思维真的是受好大的启发,谢谢! |
|
| 第4楼 pillow | 发表于 2005-12-12 14:41 |
| 初级用户 发帖 82 积分 196 | |
|
得到后在CMD中查看了FOR的帮助文件,还是有些问题要麻烦您……
生成的shellf如下: Windows Registry Editor Version 5.00 "AppData"="C:\\Documents and Settings\\pillow_zhu\\Application Data" "Cookies"="C:\\Documents and Settings\\pillow_zhu\\Cookies" "Desktop"="C:\\Documents and Settings\\pillow_zhu\\Desktop" "Favorites"="E:\\Favorites" "NetHood"="C:\\Documents and Settings\\pillow_zhu\\NetHood" "Personal"="E:\\My Documents" "PrintHood"="C:\\Documents and Settings\\pillow_zhu\\PrintHood" "Recent"="C:\\Documents and Settings\\pillow_zhu\\Recent" "SendTo"="C:\\Documents and Settings\\pillow_zhu\\SendTo" "Start Menu"="C:\\Documents and Settings\\pillow_zhu\\Start Menu" "Templates"="C:\\Documents and Settings\\pillow_zhu\\Templates" "Programs"="C:\\Documents and Settings\\pillow_zhu\\Start Menu\\Programs" "Startup"="C:\\Documents and Settings\\pillow_zhu\\Start Menu\\Programs\\Startup" "Local Settings"="C:\\Documents and Settings\\pillow_zhu\\Local Settings" "Local AppData"="C:\\Documents and Settings\\pillow_zhu\\Local Settings\\Application Data" "Cache"="E:\\Temporary Internet Files" "History"="C:\\Documents and Settings\\pillow_zhu\\Local Settings\\History" "My Pictures"="E:\\My Documents\\My Pictures" "Fonts"="C:\\WINDOWS\\Fonts" "My Music"="E:\\My Documents\\My Music" "CD Burning"="C:\\Documents and Settings\\pillow_zhu\\Local Settings\\Application Data\\Microsoft\\CD Burning" "My Video"="" "Administrative Tools"="C:\\Documents and Settings\\pillow_zhu\\Start Menu\\Programs\\Administrative Tools" 生成的~tmp.txt如下 最后%path1%显示为"C:\\Documents and Settings\\pillow_zhu\\Start Menu\\Programs\\Administrative Tools" 现在的问题有四个: 1,如何从~tmp.txt中的四个目录中挑出Start Menu开头的那一个?因为没有判别的条件,则path1则成为最后一行中的=号后边的部分 2,为什么只有导出这个主键时路径中会有两个"\" ? 比如c:\\Document,这样影响使用吗? 3,对于token的参数我还是不太懂,比如您给我的批处理中的1,2在"Administrative Tools"="C:\\Documents and Settings\\pillow_zhu\\Start Menu\\Programs\\Administrative Tools"这一行中时 1是指"Administrative Tools" 2是指"C:\\Documents and Settings\\pillow_zhu\\Start Menu\\Programs\\Administrative Tools" 是吗?那么*是指代哪一部分呢?由于对tokens不熟悉,所以问题可能有些幼稚,请见谅,呵呵 4,在FOR的DO语句中有比如( if %%i=="Start Menu" set path1=%%j 跳出循环 ) 之类这样可以再细一些判,比如断跳转或跳过此次循环之类的用法吗? |
|
| 第5楼 JonePeng | 发表于 2005-12-12 22:14 |
| 金牌会员 发帖 1,883 积分 4,562 来自 广东广州 | |
|
回第二条问题:
由于“\”是Windows系统的转义字符(非Windows专有,C语言也有),后接一些字符就代表某些含义,像像“\n”、“\t”、“\g”就分别表示换行符、跳格符(TAB)和PC喇叭响铃,所以为了区分转移字符“\”和普通路径字符“\”,在Windows系统中双写“\\”才表示一个“\”字符。 |
|
| 第6楼 Climbing | 发表于 2005-12-13 09:48 |
| 铂金会员 发帖 2,753 积分 6,962 来自 河北保定 | |
|
Re pillow:
抱歉,直到你提出问题,我才发现原来你导出的注册表文件中含有多个"Start Menu"字符串,可见你使用的应该是英文的系统。解决办法是将我给出的代码段的第二行,即“type shellf.reg | find "Start Menu" > ~tmp.txt”这一行修改为: findstr /R /C:"^\"Start Menu\"" shellf.reg > ~tmp.txt findstr是2000/xp/2003下新增的支持正则表达式的字符串搜索工具,上述命令行的功能就是从文件shellf.reg中查找以"Start Menu"打头的行,这样搜索的结果就会只过滤出你需要的那一行内容。 至于path1路径中含有双\\的问题,可以使用set命令中的替换字符串的功能来解决,如下: set path1=%path1:\\=\% 这样原来的代码就变更为: 关于“FOR /F "delims== tokens=1,2*" ...”的用法,delims==表示以“=”作为分隔符分开目标行,tokens=1,2*中的1(也就是%%i)表示“=”前面的部分,而2*表示“=”后面的部分,也就是用%%j来表示。详细请看for /?的帮助。 |
|
| 第7楼 pillow | 发表于 2005-12-13 10:24 |
| 初级用户 发帖 82 积分 196 | |
|
re JonePeng:
谢喽…您的解释我看懂了,可是另外一个问题也随之而产生… "IMJPMIG8.1"="\"C:\\WINDOWS\\IME\\imjp8_1\\IMJPMIG.EXE\" /Spoil /RemAdvDef /Migration32" 这是我的另一个键值导出来之后的样子,为什么在=后面会多出来个“\ 呢?难道是因为后面有一些运行参数? 不过我想……这个还是应该问老盖比较好吧?嘿嘿…… re Climbing: 这个还是我的疏漏啦,我第一次发贴求助的时候还不太明白求助如何才能提供完全的信息,所以并没有列出注册表的全部信息。所以您受累啦,2*的用法我现在也明白了,谢谢! 另:我的系统是装的EN,后来又打的Language Pack CHS,虽然已经在控制面板里将默认菜单之类的全部设置成CHS,可是还是好多东西都是英文的,是有此罗嗦呢,呵呵 [ Last edited by pillow on 2005-12-14 at 10:05 ] |
|
| 第8楼 pillow | 发表于 2005-12-13 13:48 |
| 初级用户 发帖 82 积分 196 | |
|
re Climbing:
奇怪的问题,你写的批处理我已经看懂了,但…… 我运行findstr /R /C:"^\"Start Menu\"" shellf.reg > ~tmp.txt 之后,~tmp.txt这个文件为空,文件大小为0字节,而shellf.reg的内容是正确的,为: Windows Registry Editor Version 5.00 "AppData"="C:\\Documents and Settings\\pillow_zhu\\Application Data" "Cookies"="C:\\Documents and Settings\\pillow_zhu\\Cookies" "Desktop"="C:\\Documents and Settings\\pillow_zhu\\Desktop" "Favorites"="E:\\Favorites" "NetHood"="C:\\Documents and Settings\\pillow_zhu\\NetHood" "Personal"="E:\\My Documents" "PrintHood"="C:\\Documents and Settings\\pillow_zhu\\PrintHood" "Recent"="C:\\Documents and Settings\\pillow_zhu\\Recent" "SendTo"="C:\\Documents and Settings\\pillow_zhu\\SendTo" "Start Menu"="C:\\Documents and Settings\\pillow_zhu\\Start Menu" "Templates"="C:\\Documents and Settings\\pillow_zhu\\Templates" "Programs"="C:\\Documents and Settings\\pillow_zhu\\Start Menu\\Programs" "Startup"="C:\\Documents and Settings\\pillow_zhu\\Start Menu\\Programs\\Startup" "Local Settings"="C:\\Documents and Settings\\pillow_zhu\\Local Settings" "Local AppData"="C:\\Documents and Settings\\pillow_zhu\\Local Settings\\Application Data" "Cache"="E:\\Temporary Internet Files" "History"="C:\\Documents and Settings\\pillow_zhu\\Local Settings\\History" "My Pictures"="" "Fonts"="C:\\WINDOWS\\Fonts" "My Music"="E:\\My Documents\\My Music" "CD Burning"="C:\\Documents and Settings\\pillow_zhu\\Local Settings\\Application Data\\Microsoft\\CD Burning" "My Video"="" "Administrative Tools"="C:\\Documents and Settings\\pillow_zhu\\Start Menu\\Programs\\Administrative Tools" 即使是运行findstr /R /C:"Start" shellf.reg > ~tmp.txt ,~tmp.txt这个文件也还是为空 这个是为什么呢? findstr这个命令返回的值是什么?搜寻到的str的所在一整行吗? [ Last edited by pillow on 2005-12-13 at 13:50 ] |
|
| 第9楼 JonePeng | 发表于 2005-12-13 19:20 |
| 金牌会员 发帖 1,883 积分 4,562 来自 广东广州 | |
Originally posted by pillow at 2005-12-13 10:24: 这个问题问得很好! 我在前面的帖子里说了“\”是转义字符,在双引号的嵌套使用时,为避免双引号使用混乱,必须用“\"”来表示一个双引号字符。因此上面的键值必须写成那样才有效,而系统在读取那一行键值时就会将“\"”解释为单一个双引号字符,即:"IMJPMIG8.1"=" "C:\WINDOWS\IME\imjp8_1\IMJPMIG.EXE" /Spoil /RemAdvDef /Migration32" 键值是由双引号包住整个键值,而由于键值里的“C:\WINDOWS\IME\imjp8_1\IMJPMIG.EXE”又用双引号,就是说双引号的嵌套使用,如果不用“\"”与键值前后的双引号加以区分必定会造成混乱导致读取错误。 呵呵,好像说得有点累赘,不知楼主明白否? “ "C:\WINDOWS\IME\imjp8_1\IMJPMIG.EXE" ”里面的双引号的作用是 为避免读取长文件名时出错而用双引号包住整个完整的路径。不过,这个路径并没有带空格的长文件名,把路径前后的双引号去掉也没问题,像这样: "IMJPMIG8.1"="C:\\WINDOWS\\IME\\imjp8_1\\IMJPMIG.EXE /Spoil /RemAdvDef /Migration32" |
|
| 第10楼 pillow | 发表于 2005-12-15 10:47 |
| 初级用户 发帖 82 积分 196 | |
|
Re JonePeng:
您說的不累贅,現在我已經懂了\的用法了,謝謝您! Re Climbing: 這個是我將shellf.reg的內容複製到2.txt裏後再執行的結果 D:\>findstr /r /c:"^\"Start Menu" 2.txt > ~tmp.txt 2.txt:"Start Menu"="C:\\Documents and Settings\\pillow_zhu\\Start Menu" FINDSTR: 无法打开 > 那麼我現在就是查找 "Start Menu 了,雖然少了一個 " 但也應該結果是相同的呀,那麼 問題1 :提示的 FINDSTR: 无法打开 > 是什麼意思? 問題2 :為什麼直接查找shellf.reg後,~tmp.txt的大小為0,但是查找相同內容的2.txt就會有結果呢?應該不是shell.reg文件的錯誤,因為我type shellf.reg的內容是正確的。 一个变通的办法是先tpye shellf.reg 2.txt然后再 findstr /R /C:"^\"Start Menu\"" 2.txt > ~tmp.txt之後 ~tmp.txt的內容是正確的了 現在奇怪的為什麼不能直接查找.reg 而一定要type到.txt文件才行呢? [ Last edited by pillow on 2005-12-17 at 16:07 ] |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |