Board logo

标题: 如果追加内容到注册表的键值?是追加而不是替换! [打印本页]

作者: okace     时间: 2008-8-21 21:10    标题: 如果追加内容到注册表的键值?是追加而不是替换!

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

问题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 ]
作者: lxmxn     时间: 2008-8-21 21:28
1、path2=%path%.\two

2、path=%path%;C:\one one\two;
作者: okace     时间: 2008-8-21 23:02
我承认我的提问做了误导。不过第二个问题是关于注册表键值的,楼上的答案好像不行吧?
问题2:
注册表项PATH的键值是C:\one one;C:\three three;
要改为                       C:\one one;C:\three three;C:\one one\two;
作者: HAT     时间: 2008-8-21 23:37

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

作者: okace     时间: 2008-8-21 23:38
我的实际情况是:
:: 建立一个批处理文件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 ]
作者: HAT     时间: 2008-8-21 23:46

@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

作者: okace     时间: 2008-8-22 00:05
楼上的先多谢了!
我看到for就头晕,正在理解中。
不过看到你应该是读取项TestPath的键值来定义two的路径,可是我希望使用setup.bat所在目录的当前路径来定义two的路径。
还有项TestPath的键值不止两个目录(C:\one one和C:\three three),而是多个目录。从代码上看好像该键值被分成两段SrcPathL和SrcPathR,一定要这样才可以吗?
还有路径都含空格,这允许吗?
还没测试,我马上测试。
作者: HAT     时间: 2008-8-22 00:10
测试以后再提问:)
作者: okace     时间: 2008-8-22 00:16
测试后项TestPath的键值为 ~-1SrcPathR;C:\one one\Setup.battwo
测试的注册表项TestPath的键值不是两个目录,是多个目录。
作者: okace     时间: 2008-8-22 00:20
测试的注册表项TestPath的键值改成两个目录,结果仍然同9楼。
作者: okace     时间: 2008-8-22 14:44
经多次试验修改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 ]
作者: HAT     时间: 2008-8-22 16:25

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

可以看看帮助:
for /?
作者: shenqingzj     时间: 2008-8-22 17:45
up
作者: okace     时间: 2008-8-22 19:10


  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 参数?
作者: HAT     时间: 2008-8-22 21:03
%0代表批处理文件本身,不能替换成%I