中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS疑难解答 & 问题讨论 (解答室) » [求助]XP下如何将注册表指定键值导出到指定变量做路径?
作者:
标题: [求助]XP下如何将注册表指定键值导出到指定变量做路径? 上一主题 | 下一主题
pillow
初级用户





积分 196
发帖 82
注册 2005-9-26
状态 离线
『楼 主』:  [求助]XP下如何将注册表指定键值导出到指定变量做路径?

我想将

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders]
"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 ]

2005-12-9 11:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 2 楼』:  

导出注册表某个键值,可以使用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%



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2005-12-10 12:35
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
pillow
初级用户





积分 196
发帖 82
注册 2005-9-26
状态 离线
『第 3 楼』:  

哇,帅呆啦!这也是个我想了好久的问题呢!
现在终于得解了!
果然是高人非常!
知识点固然学到,但方法和思维真的是受好大的启发,谢谢!

2005-12-12 11:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pillow
初级用户





积分 196
发帖 82
注册 2005-9-26
状态 离线
『第 4 楼』:  

得到后在CMD中查看了FOR的帮助文件,还是有些问题要麻烦您……

生成的shellf如下:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders]
"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
跳出循环

之类这样可以再细一些判,比如断跳转或跳过此次循环之类的用法吗?


2005-12-12 14:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
JonePeng
金牌会员

D◎$ Fαп


积分 4562
发帖 1883
注册 2004-1-19
来自 广东广州
状态 离线
『第 5 楼』:  

回第二条问题:

由于“\”是Windows系统的转义字符(非Windows专有,C语言也有),后接一些字符就代表某些含义,像像“\n”、“\t”、“\g”就分别表示换行符、跳格符(TAB)和PC喇叭响铃,所以为了区分转移字符“\”和普通路径字符“\”,在Windows系统中双写“\\”才表示一个“\”字符。



----====≡≡≡≡ 我的至爱,永远是MSDOS!≡≡≡≡====----
  
2005-12-12 22:14
查看资料  发送邮件  发短消息 网志  OICQ (373343541)  编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 6 楼』:  

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:\\=\%

这样原来的代码就变更为:
regedit /e shellf.reg "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
findstr /R /C:"^\"Start Menu\"" shellf.reg > ~tmp.txt
FOR /F "delims== tokens=1,2*" %%i in (~tmp.txt) do @set path1=%%j
set path1=%path1:\\=\%
:: 现在path1变量中已经包括了Start Menu的值
copy test.bat %path1%
del /f /q shellf.reg
del /f /q ~tmp.txt
关于“FOR /F "delims== tokens=1,2*" ...”的用法,delims==表示以“=”作为分隔符分开目标行,tokens=1,2*中的1(也就是%%i)表示“=”前面的部分,而2*表示“=”后面的部分,也就是用%%j来表示。详细请看for /?的帮助。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2005-12-13 09:48
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
pillow
初级用户





积分 196
发帖 82
注册 2005-9-26
状态 离线
『第 7 楼』:  

re JonePeng:
谢喽…您的解释我看懂了,可是另外一个问题也随之而产生…[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"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 ]

2005-12-13 10:24
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pillow
初级用户





积分 196
发帖 82
注册 2005-9-26
状态 离线
『第 8 楼』:  

re Climbing:

奇怪的问题,你写的批处理我已经看懂了,但……
我运行findstr /R /C:"^\"Start Menu\"" shellf.reg > ~tmp.txt
之后,~tmp.txt这个文件为空,文件大小为0字节,而shellf.reg的内容是正确的,为:
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders]
"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 ]

2005-12-13 13:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
JonePeng
金牌会员

D◎$ Fαп


积分 4562
发帖 1883
注册 2004-1-19
来自 广东广州
状态 离线
『第 9 楼』:  



  Quote:
Originally posted by pillow at 2005-12-13 10:24:
"IMJPMIG8.1"="\"C:\\WINDOWS\\IME\\imjp8_1\\IMJPMIG.EXE\" /Spoil /RemAdvDef /Migration32"
这是我的另一个键值导出来之后的样子,为什么在=后面会多出来个“\ 呢?难道是因为后面有一些运行参数?

这个问题问得很好! 我在前面的帖子里说了“\”是转义字符,在双引号的嵌套使用时,为避免双引号使用混乱,必须用“\"”来表示一个双引号字符。因此上面的键值必须写成那样才有效,而系统在读取那一行键值时就会将“\"”解释为单一个双引号字符,即:

"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"

   此帖被 +2 点积分    点击查看详情   




----====≡≡≡≡ 我的至爱,永远是MSDOS!≡≡≡≡====----
  
2005-12-13 19:20
查看资料  发送邮件  发短消息 网志  OICQ (373343541)  编辑帖子  回复  引用回复
pillow
初级用户





积分 196
发帖 82
注册 2005-9-26
状态 离线
『第 10 楼』:  

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 ]

2005-12-15 10:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: