Board logo

标题: [求助]for 命令如何正确执行有变量的命令[已完结] [打印本页]

作者: HUNRYBECKY     时间: 2007-1-3 05:29    标题: [求助]for 命令如何正确执行有变量的命令[已完结]

我想在BAT中执行REG EXPORT来备份注册表的某些项(这些项可能有可格等特殊符号),备份时我采用让用户在REGBAK.LST中自己定义要备份那些项,但是因为我备份的目录和文件名是不固定的,也就是说这个路径和备份名称我是在批处理中设置的变量,但是在REGBAK.LST引用变量后使用FOR命令调用却不当作变量处理.如批处理中WPATH定义路径变量,但只REGBAK.LST引用了这个WPATH变量,但执行时却不能解析这个变量,如何解决这个问题?不知道高手们是否遇到过这样的问题.
批处理中的内容:
SET WPATH=%CD%
FOR /F "eol=; tokens=1,2* delims= " %%I IN (REGBAK.LST) DO (REG EXPORT %%I)
PAUSE
REGBAK.LST中的内容:
;安装程序时需要先备份的注册表项可以直接放到这里,格式:"注册表项 注册表名",这个主要配合注册表文件OFFICE.BAK使用
"HKCR\TypeLib" %WPATH%\REGBAK\TypeLib.SVR
"HKCR\CLSID" %WPATH%\REGBAK\CLSID.SVR
"HKCR\Interface" %WPATH%\REGBAK\Interface.SVR
"HKCR\Installer" %WPATH%\REGBAK\Installer.SVR
"HKCR\Licenses" %WPATH%\REGBAK\Licenses.SVR
"HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18" %WPATH%\REGBAK\S1518.SVR
"HKCU\SOFTWARE\Microsoft\Office" %WPATH%\REGBAK\OFFICE1.SVR
"HKLM\SOFTWARE\Microsoft\Office" %WPATH%\REGBAK\OFFICE2.SVR
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active IMM" %WPATH%\REGBAK\xyz.SVR
[ Last edited by HUNRYBECKY on 2007-1-3 at 07:53 AM ]
作者: HUNRYBECKY     时间: 2007-1-3 05:35
注意的是其实REGBAK.LST中的变量部分是REG EXPORT命令的一部分,如果把%WPATH%放在批处理中,那么因为需要导出的注册表项可能因为特殊符号如空格的影响很难使用FOR命令分解出几个部分再合成一个完整的命令,所以我的思路是直接在LST文件中让用户定义路径
作者: HUNRYBECKY     时间: 2007-1-3 05:55
在线等待,自己顶一个.
作者: tghksj     时间: 2007-1-3 06:26
你需要的是将 %WPATH% 这个变量的值传递给REG EXPORT %%I

所以需要用CALL进行调用.
SET WPATH=%CD%
FOR /F "eol=; tokens=*" %%i IN (REGBAK.LST) DO (CALL REG EXPORT %%i)
[ Last edited by tghksj on 2007-1-2 at 05:27 PM ]
作者: 9527     时间: 2007-1-3 06:26
因为我系统没有REG命令,因为是在朋友家临时的,所以没法测试,不过你最初提供的默认时以空格为分隔符有些错误,因为你文本最后一行
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active IMM" %WPATH%\REGBAK\xyz.SVR
你并不能得到理想的结果,所以建议以百分号作为分隔符号!
其次不知道REG命令对于CALL命令的调用是否有效,所以不知道测试后的结果是否正确,请先试用以下代码,如果出现问题在解决
@echo off&setlocal
set WPATH=%cd%
for /f "tokens=1* delims=%%" %%i in (REGBAK.LST) do call reg export %%i %%%%j
REG EXPORT的具体参数不清楚了,我是 reg export 注册表键值 备份路径  这样写,的如有不妥请自行修改..
作者: 9527     时间: 2007-1-3 06:30
不好意思,已经有人回复你了,没有看到,呵呵............
作者: HUNRYBECKY     时间: 2007-1-3 07:34


  Quote:
Originally posted by tghksj at 2007-1-3 06:26:
你需要的是将 %WPATH% 这个变量的值传递给REG EXPORT %%I

所以需要用CALL进行调用.

[CODE]
SET WPATH=%CD%
FOR /F "eol=; tokens=*" %%i IN (REGBAK.LST) DO (CALL RE ...

兄的代码经过测试还是无效,和不使用CALL结果一样:系统找不到需要的注册表项和值
作者: HUNRYBECKY     时间: 2007-1-3 07:42


  Quote:
Originally posted by 9527 at 2007-1-3 06:26:
因为我系统没有REG命令,因为是在朋友家临时的,所以没法测试,不过你最初提供的默认时以空格为分隔符有些错误,因为你文本最后一行
[code]
&quo ...

谢谢兄的回答,测试结果和4楼的一样,我事先也想到这个方法来回避空格的问题。经过各种测试,似乎REG EXPORT 不支持保存路径中使用变量一样
作者: HUNRYBECKY     时间: 2007-1-3 07:53
不好意思,因为刚回到家里,所以直接测试上面代码出现一样的错误,原来是我自己搞错了,因为我还没有建立REGBAK目录,意思老是提示找不到,想来想去没有道理呀,结果自己检查发现自己范了这么低级的错误。

再次感谢9527和tghksj两兄,现在终于知道了要调用外部命令最好使用CALL,我在使用外部命令是一直都没有使用CALL,嘿嘿。