[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理怎样读取ini来修改其它文件的对应条目?

我在百度知道上看到一个帖子:

简单批处理,文本替换

要求是:从配置文件 profile.ini里面读取参数,从而来修改文件a.10。txt里面的对应条目。

profile.ini 内如如下:
MARKER NAME = D079
MARKER NUMBER = D079
REC = SN : 618-00124
OBSERVER = ZLY
AGENCY = D301
ANT # = 383-1072

a.10.txt的部分内容如下:
…………
…………
KPHSU77FSAO        TPS NET-G3A        3.4 Jun,23,2009 NET-REC # / TYPE / VERS
……
……

需要做的是:从profile.ini里找到REC = SN : 618-00124 ,将a.10.txt里的 KPHSU77FSAO 替换为 SN : 618-00124,即a.10.txt内容为:
…………
…………
SN : 618-00124        TPS NET-G3A        3.4 Jun,23,2009 NET-REC # / TYPE / VERS


那位达人的回答是:

先用for 读取ini文件,配合findstr 找到需要的内容
再读取a.10,把指定的内容替换为找到的,就可以了

@echo off
for /f "tokens=1,* delims==" %%i in ('findstr REC profile.ini')do set wind=%%j
(for /f "delims=" %%i in (a.10.txt)do (set snow=%%i
call echo %%snow:KPHSU77FSAO=%wind%%%))>wind.txt

若改为:
(set snow=%%i
echo %%snow:KPHSU77FSAO=%wind%%%))>wind.txt
则显示:
%snow:KPHSU77FSAO= SN : 618-00124%
%snow:KPHSU77FSAO= SN : 618-00124%
%snow:KPHSU77FSAO= SN : 618-00124%
%snow:KPHSU77FSAO= SN : 618-00124%
%snow:KPHSU77FSAO= SN : 618-00124%

若改为:
(set snow=%%i
call echo %snow:KPHSU77FSAO=%wind%%))>wind.txt
则显示:
KPHSU77FSAO= SN : 618-00124
KPHSU77FSAO= SN : 618-00124
KPHSU77FSAO= SN : 618-00124
KPHSU77FSAO= SN : 618-00124
KPHSU77FSAO= SN : 618-00124

若改为:
(set n=%%i
echo %n:KPHSU77FSAO=%wind%%))>wind.txt
则显示:
KPHSU77FSAO= SN : 618-00124
KPHSU77FSAO= SN : 618-00124
KPHSU77FSAO= SN : 618-00124
KPHSU77FSAO= SN : 618-00124
KPHSU77FSAO= SN : 618-00124

我的问题是:
为什么不用call命令就会发生上述情况?
echo后为啥用%%?两个%在一起并位于echo后时有啥作用?
谢谢。

TOP

回复 2# find


    十分感谢。看了你给的网址,发现是个变量嵌套变量的问题,而%是个逃逸字符。但是看了这些帖子之后,对于echo %%snow:KPHSU77FSAO=%wind%%%这句中,使用%%将snow:KPHSU77FSAO=%wind%括起仍不太明白。是否是因为有%wind%了,所以外面必须用两对%%括起?
另外,你给的帖子中有人这么写道:遇偶数直接脱%、遇奇数先替换再脱%。每个call脱一层。十分不理解。

TOP

回复 3# liqiochi


是否是因为有%wind%了,所以外面必须用两对%%括起?

是因为用了call

TOP

返回列表