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

[文本处理] [已解决]如何修改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压缩)
1

评分人数

    • tmplinshi: 感谢给帖子标题标注[已解决]字样PB + 2

回复 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 编辑 ]
1

评分人数

寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

哦!原来是要加个a=变量。用它来删除update\,再用它来改另外两条记录。——我是按您你以前给的代码照葫芦画瓢做的,没想到变量替换。
谢谢寒夜孤星老师这么快就回复了!

TOP

原帖由 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 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

题外话

寒夜在论坛相当活跃,技术也很不错,是否有意申请代码咨询&讨论的版主呢?这样能更好为广大会员服务啊。
***共同提高***

TOP

这两个代码太好啦!我正想问您如果处理大量行记录怎么办,自己试了好多遍FOR,都没成功。
另外,你的代码实在奥妙,还有看不懂的:

set b=!b:update\=!,为什么update\=后边有=号呢?试了一下,去掉=号就不能产生正确结果。这=号是的作用原理是什么?

[ 本帖最后由 stance 于 2010-12-26 14:38 编辑 ]

TOP

原帖由 batman 于 2010-12-26 13:58 发表
寒夜在论坛相当活跃,技术也很不错,是否有意申请代码咨询&讨论的版主呢?这样能更好为广大会员服务啊。


支持!支持!
寒夜人好,技术好,让人钦佩不已。

TOP

回复 6楼 的帖子

set/?就可以看到:
环境变量替换已如下增强:

    %PATH:str1=str2%

  会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
  要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
  "str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的开始到 str1 剩余部分第一次出现的地方,都一直保持相配。
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

呵呵!刚才分析代码时看到一行有两个=号,突然被搞糊涂了。第二个等号是表示它没被赋值,输出空值。——对文本处理技术还是不熟练,得多练习。

TOP

返回列表