中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如果追加内容到注册表的键值?是追加而不是替换!
作者:
标题: 如果追加内容到注册表的键值?是追加而不是替换! 上一主题 | 下一主题
okace
初级用户




积分 130
发帖 15
注册 2004-7-30
状态 离线
『楼 主』:  如果追加内容到注册表的键值?是追加而不是替换!

在论坛看了好几篇关于修改注册表的帖子,没找到追加注册表键值的内容,只好发帖来问。

问题1:
已知:Path=C:\one one
如何得到Path2,使Path2=C:\one one\two
其中two是固定值,one one代表含空格名称的文件夹。

问题2:
如何让一个注册表项PATH的键值从
Path=C:\one one;C:\three three;
改为
Path=C:\one one;C:\three three;C:\one one\two;
就是把Path2的内容追加到Path的键值中?


我的实际情况是:
:: 建立一个批处理文件setup.bat,放在C:\one one里(该目录是可变的)
:: setup.bat所在目录中肯定有一个文件夹Express,然后开始建立setup.bat
SET PATH=%CD%
SET PATH=%PATH%.\Express
:: 现在得到了一个要填入的注册表键值C:\one one\Express
:: HKCU\Software\Test下有一个注册表项TestPath,类型REG_SZ
:: 注册表项TestPath的键值为C:\two two;C:\three three;C:\five five;
:: 现在要填入前面得到的键值
::      使TestPath键值改为C:\two two;C:\three three;C:\five five;C:\one one\Express;
:: 以上的目录,除Express名称不可变外,其余的文件夹名称均为可变,且均含空格
请指教,谢谢!

[ Last edited by okace on 2008-8-22 at 12:43 AM ]

2008-8-21 21:10
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 2 楼』:  

1、path2=%path%.\two

2、path=%path%;C:\one one\two;

2008-8-21 21:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
okace
初级用户




积分 130
发帖 15
注册 2004-7-30
状态 离线
『第 3 楼』:  

我承认我的提问做了误导。不过第二个问题是关于注册表键值的,楼上的答案好像不行吧?
问题2:
注册表项PATH的键值是C:\one one;C:\three three;
要改为                       C:\one one;C:\three three;C:\one one\two;

2008-8-21 23:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 4 楼』:  


reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d "%path%;C:\one one\two" /f




2008-8-21 23:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
okace
初级用户




积分 130
发帖 15
注册 2004-7-30
状态 离线
『第 5 楼』:  

我的实际情况是:
:: 建立一个批处理文件setup.bat,放在C:\one one里(该目录是可变的)
:: setup.bat所在目录中肯定有一个文件夹two,然后开始建立setup.bat
SET PATH=%CD%
SET PATH=%PATH%.\two
:: 现在得到了一个要填入的注册表键值C:\one one\two
:: HKCU\Software\Test下有一个注册表项TestPath,类型REG_SZ
:: 注册表项TestPath的键值为C:\one one;C:\three three;
:: 现在要填入前面得到的键值
::      使TestPath键值改为C:\one one;C:\three three;C:\one one\two;
请问上面的状况如何解决?我知道增加注册表项用 reg add 命令,但是实在不知如何利用变量!请大家帮忙!

[ Last edited by okace on 2008-8-21 at 11:43 PM ]

2008-8-21 23:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 6 楼』:  


@echo off
for /f "skip=4 tokens=1,2* delims=:" %%a in ('reg query "HKCU\Software\Test" /v TestPath') do (
  set SrcPathL=%%a
  set SrcPathR=%%b
)
set SrcPath=%SrcPathL:~-1%:%SrcPathR%
set CurPath=%~f0two
set NewPath=%SrcPath%;%CurPath%
reg add "HKCU\Software\Test" /v TestPath /t REG_SZ /d "%NewPath%" /f




2008-8-21 23:46
查看资料  发短消息 网志   编辑帖子  回复  引用回复
okace
初级用户




积分 130
发帖 15
注册 2004-7-30
状态 离线
『第 7 楼』:  

楼上的先多谢了!
我看到for就头晕,正在理解中。
不过看到你应该是读取项TestPath的键值来定义two的路径,可是我希望使用setup.bat所在目录的当前路径来定义two的路径。
还有项TestPath的键值不止两个目录(C:\one one和C:\three three),而是多个目录。从代码上看好像该键值被分成两段SrcPathL和SrcPathR,一定要这样才可以吗?
还有路径都含空格,这允许吗?
还没测试,我马上测试。

2008-8-22 00:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 8 楼』:  

测试以后再提问:)



2008-8-22 00:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
okace
初级用户




积分 130
发帖 15
注册 2004-7-30
状态 离线
『第 9 楼』:  

测试后项TestPath的键值为 ~-1SrcPathR;C:\one one\Setup.battwo
测试的注册表项TestPath的键值不是两个目录,是多个目录。

2008-8-22 00:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
okace
初级用户




积分 130
发帖 15
注册 2004-7-30
状态 离线
『第 10 楼』:  

测试的注册表项TestPath的键值改成两个目录,结果仍然同9楼。

2008-8-22 00:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
okace
初级用户




积分 130
发帖 15
注册 2004-7-30
状态 离线
『第 11 楼』:  

经多次试验修改6楼的代码如下:
@echo off
for /f "skip=4 tokens=1,* delims=:" %%a in ('reg query "HKCU\Software\Test" /v TestPath') do (
  set SrcPathL=%%a
  set SrcPathR=%%b
)
set SrcPath=%SrcPathL:~-1%:%SrcPathR%
SET CurPATH=%CD%
SET CurPATH=%CurPATH%\two;
set CurPATH=%SrcPath%%CurPath%
reg add "HKCU\Software\Test" /v TestPath /t REG_SZ /d "%CurPath%" /f
经修改后基本满足要求了。非常感谢 HAT 的帮助。
可是 set CurPath=%~f0two 这行代码不理解啊,输入结果是当前目录含文件名的,比如会输出 D:\temp\a.battwo 。关于 %~f0 参数,请问哪里有资料可以参考?我在帮助里找不到这个参数。

[ Last edited by okace on 2008-8-22 at 03:13 PM ]

2008-8-22 14:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 12 楼』:  


set CurPath=%~f0two
改成
set CurPath=%~dp0two

可以看看帮助:
for /?



2008-8-22 16:25
查看资料  发短消息 网志   编辑帖子  回复  引用回复
shenqingzj
新手上路





积分 2
发帖 1
注册 2008-8-22
状态 离线
『第 13 楼』:  

up

2008-8-22 17:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
okace
初级用户




积分 130
发帖 15
注册 2004-7-30
状态 离线
『第 14 楼』:  



  Quote:
另外,FOR 变量参照的替换已被增强。您现在可以使用下列
选项语法:

     ~I         - 删除任何引号("),扩充 %I
     %~fI        - 将 %I 扩充到一个完全合格的路径名
     %~dI        - 仅将 %I 扩充到一个驱动器号
     %~pI        - 仅将 %I 扩充到一个路径
     %~nI        - 仅将 %I 扩充到一个文件名
     %~xI        - 仅将 %I 扩充到一个文件扩展名
     %~sI        - 扩充的路径只含有短名
     %~aI        - 将 %I 扩充到文件的文件属性
     %~tI        - 将 %I 扩充到文件的日期/时间
     %~zI        - 将 %I 扩充到文件的大小
     %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩充
                   到找到的第一个完全合格的名称。如果环境变量名
                   未被定义,或者没有找到文件,此组合键会扩充到
                   空字符串

可以组合修饰符来得到多重结果:

     %~dpI       - 仅将 %I 扩充到一个驱动器号和路径
     %~nxI       - 仅将 %I 扩充到一个文件名和扩展名
     %~fsI       - 仅将 %I 扩充到一个带有短名的完整路径名
     %~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
                   到找到的第一个驱动器号和路径。
     %~ftzaI     - 将 %I 扩充到类似输出线路的 DIR

这段我看到过,可是使用I替换0反而运行错误,我还以为不是这个参数。
请问为什么使用 %~f0 而不是帮助里的 %~fI 参数?

2008-8-22 19:10
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 15 楼』:  

%0代表批处理文件本身,不能替换成%I



2008-8-22 21:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: