标题: [文本处理] [已解决]如何修改DOSNET.INF文本中的多条记录? [打印本页]
作者: stance 时间: 2010-12-26 13:00 标题: [已解决]如何修改DOSNET.INF文本中的多条记录?
前些天,在寒夜孤星老师的帮助下,初步学会了文本修改。最近几天碰到一个新问题:以前处理的几个文本都是修改单一记录的,现在要修改多条记录,用原来的方法一直通不过。具体情况如下:
要修改DOSNET.INF文本:
1、删除该文本内记录项中所有的update\,但保留update\后边的文件名,如:把d1,update\mpsyschk.dll修改成d1,mpsyschk.dll。
2、增加修改其他项:把d1,mp4sdecd.dll改成d1,wmp11\mp4sdecd.dll,把d1,mp4sds32.ax改成d1,wmp11\mp4sds32.ax。
我做的批处理在单独做第1种修改时已经能够实现,但把做第2种修改也增加进来时却屡试不行:只把d1,mp4sdecd.dll这一行删除了,其他的没动。
我的批处理如下:- @echo off&setlocal enabledelayedexpansion
- (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "DOSNET.INF"') do if "%%b"=="" (echo/) else (
- set b=%%b
- if /i not "!b:~3,7!"=="update\" (
- if /i not "!b:~3,12!"=="mp4sdecd.dll" (
- if /i not "!3,11!"=="mp4sds32.ax" (echo %%b) else (
- if /i "!b:~3,7!"=="update\" echo !b:~0,3!!Ye:~8!
- if /i "!b:~3,12!"=="mp4sdecd.dll" echo !b:~0,3!wmp11\!Ye:~4!
- if /i "!b:~3,11!"=="mp4sds32.ax" echo !b:~0,3!wmp11\!Ye:~4!
- )))))>"DOSNET.INF.TMP"
复制代码
请帮忙看看,我这个批处理错在哪了?
附DOSNET.INF文件(ANSI编码,做了RAR压缩)
作者: hanyeguxing 时间: 2010-12-26 13:25 标题: 回复 1楼 的帖子
楼主把简单的问题复杂化了:- @echo off&setlocal enabledelayedexpansion
- set n=DOSNET.INF
- set m=mp4sdecd.dll mp4sds32.ax
- (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%n%"') do if "%%b"=="" (echo/) else (
- set b=%%b
- set b=!b:update\=!
- set b=!b: =!
- for %%c in (%m%) do if /i "!b:~3!"=="%%c" set b=!b:~0,3!wmp11\!b:~3!
- echo !b!
- ))>"%n%_"
- move "%n%_" "%n%"
复制代码
set b=!b: =!是用来允许行首、行尾有若干连续空格的,也可以不要
[ 本帖最后由 hanyeguxing 于 2010-12-26 13:56 编辑 ]
作者: stance 时间: 2010-12-26 13:36
哦!原来是要加个a=变量。用它来删除update\,再用它来改另外两条记录。——我是按您你以前给的代码照葫芦画瓢做的,没想到变量替换。
谢谢寒夜孤星老师这么快就回复了!
作者: hanyeguxing 时间: 2010-12-26 13:38
原帖由 stance 于 2010-12-26 13:36 发表
哦!原来是要加个a=变量。用它来删除update\,再用它来改另外两条记录。——我是按您你以前给的代码照葫芦画瓢做的,没想到变量替换。
谢谢寒夜孤星老师这么快就回复了!
把两个if中的b都改成a ,是为了让楼主更好区分而已
如果行首尾没有空格,则可以:- @echo off&setlocal enabledelayedexpansion
- set n=DOSNET.INF
- set m=mp4sdecd.dll mp4sds32.ax
- (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%n%"') do if "%%b"=="" (echo/) else (
- set b=%%b
- set b=!b:update\=!
- for %%c in (%m%) do if /i "!b:~3!"=="%%c" set b=!b:~0,3!wmp11\!b:~3!
- echo !b!
- ))>"%n%_"
- move "%n%_" "%n%"
复制代码
[ 本帖最后由 hanyeguxing 于 2010-12-26 13:56 编辑 ]
作者: batman 时间: 2010-12-26 13:58 标题: 题外话
寒夜在论坛相当活跃,技术也很不错,是否有意申请代码咨询&讨论的版主呢?这样能更好为广大会员服务啊。
作者: stance 时间: 2010-12-26 14:02
这两个代码太好啦!我正想问您如果处理大量行记录怎么办,自己试了好多遍FOR,都没成功。
另外,你的代码实在奥妙,还有看不懂的:
set b=!b:update\=!,为什么update\=后边有=号呢?试了一下,去掉=号就不能产生正确结果。这=号是的作用原理是什么?
[ 本帖最后由 stance 于 2010-12-26 14:38 编辑 ]
作者: stance 时间: 2010-12-26 14:03
原帖由 batman 于 2010-12-26 13:58 发表
寒夜在论坛相当活跃,技术也很不错,是否有意申请代码咨询&讨论的版主呢?这样能更好为广大会员服务啊。
支持!支持!
寒夜人好,技术好,让人钦佩不已。
作者: hanyeguxing 时间: 2010-12-26 15:06 标题: 回复 6楼 的帖子
set/?就可以看到:环境变量替换已如下增强:
%PATH:str1=str2%
会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的开始到 str1 剩余部分第一次出现的地方,都一直保持相配。
作者: stance 时间: 2010-12-26 15:16
呵呵!刚才分析代码时看到一行有两个=号,突然被搞糊涂了。第二个等号是表示它没被赋值,输出空值。——对文本处理技术还是不熟练,得多练习。
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |