Board logo

标题: [文本处理] [已解决]如何修改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这一行删除了,其他的没动。

我的批处理如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "DOSNET.INF"') do if "%%b"=="" (echo/) else (
  3.     set b=%%b
  4.     if /i not "!b:~3,7!"=="update\" (
  5.         if /i not "!b:~3,12!"=="mp4sdecd.dll" (
  6.             if /i not "!3,11!"=="mp4sds32.ax" (echo %%b) else (
  7.                 if /i "!b:~3,7!"=="update\" echo !b:~0,3!!Ye:~8!
  8.                 if /i "!b:~3,12!"=="mp4sdecd.dll" echo !b:~0,3!wmp11\!Ye:~4!
  9.                 if /i "!b:~3,11!"=="mp4sds32.ax" echo !b:~0,3!wmp11\!Ye:~4!
  10. )))))>"DOSNET.INF.TMP"
复制代码
请帮忙看看,我这个批处理错在哪了?

附DOSNET.INF文件(ANSI编码,做了RAR压缩)
作者: hanyeguxing    时间: 2010-12-26 13:25     标题: 回复 1楼 的帖子

楼主把简单的问题复杂化了:
  1. @echo off&setlocal enabledelayedexpansion
  2. set n=DOSNET.INF
  3. set m=mp4sdecd.dll mp4sds32.ax
  4. (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%n%"') do if "%%b"=="" (echo/) else (
  5.     set b=%%b
  6.     set b=!b:update\=!
  7.     set b=!b: =!
  8.     for %%c in (%m%) do if /i "!b:~3!"=="%%c" set b=!b:~0,3!wmp11\!b:~3!
  9.     echo !b!
  10. ))>"%n%_"
  11. 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 ,是为了让楼主更好区分而已


如果行首尾没有空格,则可以:
  1. @echo off&setlocal enabledelayedexpansion
  2. set n=DOSNET.INF
  3. set m=mp4sdecd.dll mp4sds32.ax
  4. (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%n%"') do if "%%b"=="" (echo/) else (
  5.     set b=%%b
  6.     set b=!b:update\=!
  7.     for %%c in (%m%) do if /i "!b:~3!"=="%%c" set b=!b:~0,3!wmp11\!b:~3!
  8.     echo !b!
  9. ))>"%n%_"
  10. 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://www.bathome.net/) Powered by Discuz! 7.2