中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-09 11:37
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如果追加内容到注册表的键值?是追加而不是替换! 查看 998 回复 14
楼 主 如果追加内容到注册表的键值?是追加而不是替换! 发表于 2008-08-21 21:10 ·  中国 福建 莆田 电信
初级用户
积分 130
发帖 15
注册 2004-07-30 00:00
22年会员
UID 29294
性别 男
状态 离线
在论坛看了好几篇关于修改注册表的帖子,没找到追加注册表键值的内容,只好发帖来问。

问题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 ]
2 发表于 2008-08-21 21:28 ·  中国 湖北 武汉 联通
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
1、path2=%path%.\two

2、path=%path%;C:\one one\two;
3 发表于 2008-08-21 23:02 ·  中国 福建 莆田 电信
初级用户
积分 130
发帖 15
注册 2004-07-30 00:00
22年会员
UID 29294
性别 男
状态 离线
我承认我的提问做了误导。不过第二个问题是关于注册表键值的,楼上的答案好像不行吧?
问题2:
注册表项PATH的键值是C:\one one;C:\three three;
要改为 C:\one one;C:\three three;C:\one one\two;
4 发表于 2008-08-21 23:37 ·  中国 重庆 九龙坡区 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d "%path%;C:\one one\two" /f
5 发表于 2008-08-21 23:38 ·  中国 福建 莆田 电信
初级用户
积分 130
发帖 15
注册 2004-07-30 00:00
22年会员
UID 29294
性别 男
状态 离线
我的实际情况是:


:: 建立一个批处理文件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 ]
6 发表于 2008-08-21 23:46 ·  中国 重庆 九龙坡区 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
@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
7 发表于 2008-08-22 00:05 ·  中国 福建 莆田 电信
初级用户
积分 130
发帖 15
注册 2004-07-30 00:00
22年会员
UID 29294
性别 男
状态 离线
楼上的先多谢了!
我看到for就头晕,正在理解中。
不过看到你应该是读取项TestPath的键值来定义two的路径,可是我希望使用setup.bat所在目录的当前路径来定义two的路径。
还有项TestPath的键值不止两个目录(C:\one one和C:\three three),而是多个目录。从代码上看好像该键值被分成两段SrcPathL和SrcPathR,一定要这样才可以吗?
还有路径都含空格,这允许吗?
还没测试,我马上测试。
8 发表于 2008-08-22 00:10 ·  中国 重庆 九龙坡区 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
测试以后再提问:)
9 发表于 2008-08-22 00:16 ·  中国 福建 莆田 电信
初级用户
积分 130
发帖 15
注册 2004-07-30 00:00
22年会员
UID 29294
性别 男
状态 离线
测试后项TestPath的键值为 ~-1SrcPathR;C:\one one\Setup.battwo
测试的注册表项TestPath的键值不是两个目录,是多个目录。
10 发表于 2008-08-22 00:20 ·  中国 福建 莆田 电信
初级用户
积分 130
发帖 15
注册 2004-07-30 00:00
22年会员
UID 29294
性别 男
状态 离线
测试的注册表项TestPath的键值改成两个目录,结果仍然同9楼。
11 发表于 2008-08-22 14:44 ·  中国 福建 莆田 电信
初级用户
积分 130
发帖 15
注册 2004-07-30 00:00
22年会员
UID 29294
性别 男
状态 离线
经多次试验修改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 ]
12 发表于 2008-08-22 16:25 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线

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

可以看看帮助:
for /?
13 发表于 2008-08-22 17:45 ·  中国 上海 电信
新手上路
积分 2
发帖 1
注册 2008-08-22 17:19
17年会员
UID 123884
性别 男
状态 离线
up
14 发表于 2008-08-22 19:10 ·  中国 福建 莆田 电信
初级用户
积分 130
发帖 15
注册 2004-07-30 00:00
22年会员
UID 29294
性别 男
状态 离线
另外,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 参数?
15 发表于 2008-08-22 21:03 ·  中国 重庆 九龙坡区 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
%0代表批处理文件本身,不能替换成%I
论坛跳转: