中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-02 22:48
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]for 命令如何正确执行有变量的命令[已完结] 查看 1,178 回复 8
楼 主 [求助]for 命令如何正确执行有变量的命令[已完结] 发表于 2007-01-03 05:29 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,179
发帖 442
注册 2006-09-09 22:47
19年会员
UID 62249
状态 离线
我想在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 ]
2 发表于 2007-01-03 05:35 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,179
发帖 442
注册 2006-09-09 22:47
19年会员
UID 62249
状态 离线
注意的是其实REGBAK.LST中的变量部分是REG EXPORT命令的一部分,如果把%WPATH%放在批处理中,那么因为需要导出的注册表项可能因为特殊符号如空格的影响很难使用FOR命令分解出几个部分再合成一个完整的命令,所以我的思路是直接在LST文件中让用户定义路径
3 发表于 2007-01-03 05:55 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,179
发帖 442
注册 2006-09-09 22:47
19年会员
UID 62249
状态 离线
在线等待,自己顶一个.
4 发表于 2007-01-03 06:26 ·  中国 山东 济南 电信
社区乞丐
★★
此图片另存后死机
积分 -49
发帖 90
注册 2006-12-02 13:00
19年会员
UID 72412
性别 男
状态 离线
你需要的是将 %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 ]
我的网络笔记本.非联系本人请勿访问!http://w.vicp.net
5 发表于 2007-01-03 06:26 ·  中国 北京 顺义区 联通
银牌会员
★★★
努力做坏人
积分 1,185
发帖 438
注册 2006-08-28 12:00
19年会员
UID 61449
来自 北京
状态 离线
因为我系统没有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 注册表键值 备份路径 这样写,的如有不妥请自行修改..
我今后在论坛的目标就是做个超级坏人!!!
6 发表于 2007-01-03 06:30 ·  中国 北京 顺义区 联通
银牌会员
★★★
努力做坏人
积分 1,185
发帖 438
注册 2006-08-28 12:00
19年会员
UID 61449
来自 北京
状态 离线
不好意思,已经有人回复你了,没有看到,呵呵............
我今后在论坛的目标就是做个超级坏人!!!
7 发表于 2007-01-03 07:34 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,179
发帖 442
注册 2006-09-09 22:47
19年会员
UID 62249
状态 离线
Originally posted by tghksj at 2007-1-3 06:26:
你需要的是将 %WPATH% 这个变量的值传递给REG EXPORT %%I

所以需要用CALL进行调用.


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



兄的代码经过测试还是无效,和不使用CALL结果一样:系统找不到需要的注册表项和值
8 发表于 2007-01-03 07:42 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,179
发帖 442
注册 2006-09-09 22:47
19年会员
UID 62249
状态 离线
Originally posted by 9527 at 2007-1-3 06:26:
因为我系统没有REG命令,因为是在朋友家临时的,所以没法测试,不过你最初提供的默认时以空格为分隔符有些错误,因为你文本最后一行

&quo ...



谢谢兄的回答,测试结果和4楼的一样,我事先也想到这个方法来回避空格的问题。经过各种测试,似乎REG EXPORT 不支持保存路径中使用变量一样
9 发表于 2007-01-03 07:53 ·  中国 广东 东莞 电信
银牌会员
★★★
积分 1,179
发帖 442
注册 2006-09-09 22:47
19年会员
UID 62249
状态 离线
不好意思,因为刚回到家里,所以直接测试上面代码出现一样的错误,原来是我自己搞错了,因为我还没有建立REGBAK目录,意思老是提示找不到,想来想去没有道理呀,结果自己检查发现自己范了这么低级的错误。

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