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

[文本处理] [已解决]如何给文本添加行及删除位置不确定的字符串所在的行?

要处理INTL.INF文件中的若干个行:

1、将E00E0804改为E0860804
2、将pintlgnt.ime改为sun86.ime
3、删除simsun.ttc,,,65536一行
4、在[SourceDisksFiles]段的末尾追加3行内容:
Sun86.IME    = 107,,,,,,,0,0
Sun86.mb     = 107,,,,,,,0,0
Sun86.chm    = 107,,,,,,,0,0

5、删除其它所有的含有pintlgnt字符串的行(但不能把含有pintlgnt.ime字符串的行删掉,因为它要改成sun86.ime),pintlgnt字符串在各行中的位置不确定。

目前,已经实现1、2、3项,但无法实现4、5两项需求。当前代码如下:
  1. type INTL.INF>INTL.TMP@echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "INTL.TMP"') do if "%%b"=="" (echo/) else (
  3.     set "hy=%%b"
  4.     set hy=!hy:E00E0804=E0860804!
  5.     set hy=!hy:pintlgnt.ime=sun86.ime!
  6.     if /i not "!hy:~0,18!"=="simsun.ttc,,,65536" echo !hy!
  7. ))>"INTL.INF"
复制代码
这里对添加行还有一个要求,即首先要找到[SourceDisksFiles]段,然后在它的下一个段开始前添加行,因此不能用人工定位该段最后一行字符串的办法添加。

实际上还需要修改txtsetup.sif和 DOSNET.INF两个文件,情况类似。只是想通过修改这个文件,自己学会利用段名来确定位置,在指定位置添加含有特殊字符的行,以及删改含有某个位置不确定的字符串所在的行。

在论坛搜索到了一些添加行的方法,一时无从下手,又急着用,就直接问了。

附:INTL.INF文件压缩件(UNCODE编码)

[ 本帖最后由 stance 于 2011-1-10 16:27 编辑 ]
1

评分人数

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

奇怪!一加CODE代码就乱,只好这么发了。批处理的格式也改不过来,麻烦版主帮助弄一下吧。

[ 本帖最后由 stance 于 2011-1-10 00:19 编辑 ]

TOP

以下代码会修改INTL.INF,先备份INTL.INF文件。。。
  1. @echo off
  2. (for /f "delims=" %%i in ('findstr /iv "simsun.ttc,,,65536" INTL.INF') do (
  3.    set "str=%%i"
  4.    setlocal enabledelayedexpansion
  5.    set str=!str:e00e0804=e0860804!
  6.    set str=!str:pintlgnt.ime=sun86.ime!
  7.    set num=!str:pintlgnt=!
  8.    if "!num!"=="!str!" echo;!str!
  9.    if /i "!str!"=="[sourcedisksfiles]" (
  10.       echo Sun86.IME    = 107,,,,,,,0,0
  11.       echo Sun86.mb     = 107,,,,,,,0,0
  12.       echo Sun86.chm    = 107,,,,,,,0,0
  13.    )
  14.    endlocal
  15. ))>tem
  16. move tem INTL.INF
  17. start "" "INTL.INF"
复制代码
1

评分人数

    • stance: 实在是高!甚为体贴。技术 + 1
技术问题请到论坛发帖求助!

TOP

1,楼主提供的inf文件中,包含大量UNICODE编码字符,这些字符在输出为ANSI编码时会错误。
2,要把内容加到[SourceDisksFiles]节的最下面,但楼主提供的文件中包含2个[SourceDisksFiles]节,加在哪个最下面?

[ 本帖最后由 hanyeguxing 于 2011-1-10 14:22 编辑 ]
1

评分人数

    • stance: 认真负责,细致入微。技术 + 1
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

回复 3楼 的帖子

感谢随风老大给出的批处理,甚合我意。
代码实在高超,一个DO()>tem就把文本内容输出来了——还在琢磨是怎么回事,是不是隐含的ELSE语句起了作用?
括号内的语句平实易懂,移植性强,真是大道至简,叹为观止!

TOP

回复 4楼 的帖子

回 寒夜版主:
1、UNICODE码的问题确实存在,文本中的所有韩文和部分日文字符被显示为??号。我用“另存为”测试,也是这样,因此认为这是UNCODE转码的问题。
我看到您的头像里有韩文字符,正想专门问这个问题。
表面上看,这个问题不影响安装和使用,所以没急着问,但不知是否存在隐蔽的系统缺陷。如果能解决,最好不过了。
2、[SourceDisksFiles]问题:应该加在第一个后面。我也是刚刚发现这个问题,琢磨该怎么处理。

TOP

1,如果要保证编码不出问题,推荐使用第三方或 vbs
2:
  1. @echo off&setlocal enabledelayedexpansion
  2. type "INTL.INF">temp
  3. set c==
  4. (for /f "tokens=1* delims=:" %%a in ('findstr /nivx "simsun.ttc,,,65536" "temp"') do if "%%b"=="" (echo/) else (
  5.    set "b=%%b"
  6.    if "!c!!d!"=="==" if "!b:~0,1!!b:~-1!"=="[]" (
  7.       echo Sun86.IME    = 107,,,,,,,0,0
  8.       echo Sun86.mb     = 107,,,,,,,0,0
  9.       echo Sun86.chm    = 107,,,,,,,0,0
  10.       set c=&set d=
  11.    )
  12.    if /i "!b!"=="[sourcedisksfiles]" set d==
  13.    set b=!b:e00e0804=e0860804!
  14.    set b=!b:pintlgnt.ime=sun86.ime!
  15.    set a=!b:pintlgnt=!
  16.    if "!a!"=="!b!" echo/!b!
  17. ))>"INTL.INF"
  18. del temp
复制代码

[ 本帖最后由 hanyeguxing 于 2011-1-10 14:35 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

回复 7楼 的帖子

这个方案不错!谢谢寒夜版主。
不过,运行后输出一个空文本——您的代码中findb,应该是findstr吧,我是改后又测试过的。

TOP

回复 8楼 的帖子

打字总马马虎虎的,不好意思,已经改正
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

奇怪的现象,生成过一次新文本,以后再运行,又出空文本。以前也遇到过这类情况,找不到原因。

另外,在生成的那次查看,好像第二个[sourcedisksfiles]段中也被加入了新的字符串。

TOP

把内容加到第一个[sourcedisksfiles]后面
:
  1. @echo off
  2. (for /f "delims=" %%i in ('findstr /iv "simsun.ttc,,,65536" INTL.INF') do (
  3.    set "str=%%i"
  4.    if /i "%%i"=="[sourcedisksfiles]" set /a flag+=1
  5.    setlocal enabledelayedexpansion
  6.    set str=!str:e00e0804=e0860804!
  7.    set str=!str:pintlgnt.ime=sun86.ime!
  8.    set num=!str:pintlgnt=!
  9.    if "!num!"=="!str!" echo;!str!
  10.    if !flag! equ 1 (
  11.       echo Sun86.IME    = 107,,,,,,,0,0
  12.       echo Sun86.mb     = 107,,,,,,,0,0
  13.       echo Sun86.chm    = 107,,,,,,,0,0
  14.    )
  15.    endlocal
  16. ))>tem
  17. move tem INTL.INF
  18. start "" "INTL.INF"
复制代码
技术问题请到论坛发帖求助!

TOP

回复 10楼 的帖子

实际测试,使用 UltraCompare 二进制完全比较,未发现任何差异。
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

回复 11楼 的帖子

楼主是要把内容加的此节的最下面,不是节名的下一行,呵呵,而且文件为源UNICODE编码

顺便再说7楼的代码要求先将源文件的只读属性去掉,否则:
  1. @echo off&setlocal enabledelayedexpansion
  2. type "INTL.INF">temp
  3. set c==
  4. (for /f "tokens=1* delims=:" %%a in ('findstr /nivx "simsun.ttc,,,65536" "temp"') do if "%%b"=="" (echo/) else (
  5.    set "b=%%b"
  6.    if "!c!!d!"=="==" if "!b:~0,1!!b:~-1!"=="[]" (
  7.       echo Sun86.IME    = 107,,,,,,,0,0
  8.       echo Sun86.mb     = 107,,,,,,,0,0
  9.       echo Sun86.chm    = 107,,,,,,,0,0
  10.       set c=&set d=
  11.    )
  12.    if /i "!b!"=="[sourcedisksfiles]" set d==
  13.    set b=!b:e00e0804=e0860804!
  14.    set b=!b:pintlgnt.ime=sun86.ime!
  15.    set a=!b:pintlgnt=!
  16.    if "!a!"=="!b!" echo/!b!
  17. ))>temp2
  18. move temp2 "INTL.INF"
  19. del /q temp
复制代码

[ 本帖最后由 hanyeguxing 于 2011-1-10 15:38 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

回复 11楼 的帖子

谢谢随风老大再出手!
这个代码的意思我大概读懂了,但我自己做不出来,也不会改。
测试结果有点问题:从第一个[sourcedisksfiles]段开始,每一行后面都被加入了三行这样的内容:
Sun86.IME    = 107,,,,,,,0,0
Sun86.mb     = 107,,,,,,,0,0
Sun86.chm    = 107,,,,,,,0,0
批处理在接到[sourcedisksfiles]指示后,就从这一行开始,给每行都加这三行内容。
似乎应该再加点条件限制,防止它给以后各行都加新三行。

TOP

回复 12楼的帖子

回寒夜版主:
1、大概是我的系统环境有问题,以前你给我代码时也遇到过。
刚才换了台机器测试,还是空文本。如果你测试没问题,相信就能通过。我再换个办法试试。

2、如果代码太复杂,只加到节名下面也行。
3、不要求非得UNICODE编码。

另外,我用TOTAL COMMAND自带的”比较文件内容“功能,也很强大,而且非常方便、体贴。这个软件有很多强大的功能,支持正则表达式,尤其适合常玩DOS的人,建议试试。

[ 本帖最后由 stance 于 2011-1-10 15:07 编辑 ]

TOP

返回列表