Board logo

标题: [文本处理] [已解决]怎样用批处理FOR语句修改SRCHASST.INF文本? [打印本页]

作者: stance    时间: 2010-12-28 20:57     标题: [已解决]怎样用批处理FOR语句修改SRCHASST.INF文本?

我已经有了一个可以实现修改SRCHASST.INF文本的批处理(代码的第一部分,网站好像不让在一张帖子里写两个代码)。
现在想用FOR语句来简化它,也是为了学习。但新的语句无法通过。
问题出在set hy=!hy:~0=!这一句上。它要求删除%n%这一行。如果是修改产生一个有值的结果,这一句还行。但要输出空值,就不行了。请教怎么个改法才好呢?
  1. 可用的原代码:
  2. @echo off&setlocal enabledelayedexpansion
  3. (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "SRCHASST.tmp"') do if "%%b"=="" (echo/) else (
  4.         set "hy=%%b"
  5.     if /i not "!hy:~0,7!"=="msgr3en" (
  6.         if /i not "!hy:~0,8!"=="nls302en" (
  7.             if /i not "!hy:~0,8!"=="courtney" (
  8.                 if /i not "!hy:~0,4!"=="earl" (
  9.                     if /i not "!hy:~0,5!"=="rover" (echo !hy!)
  10. ))))))>"SRCHASST.INF"
  11. 有问题的新代码:
  12. set pth=SRCHASST
  13. set n=msgr3en.dll nls302en.lex courtney.acs earl.acs rover.acs
  14. expand %pth%.in_ %pth%.inf
  15. type "%pth%.inf">"%pth%.tmp"
  16. @echo off&setlocal enabledelayedexpansion
  17. (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%pth%.tmp"') do if "%%b"=="" (echo/) else (
  18.     set hy=%%b
  19.     for %%c in (%n%) do if /i "!hy:~0,-5!"=="%%c" set hy=!hy:~0=!
  20.     echo !hy!
  21. ))>"%pth%.inf.tmp"
  22. move /y "%pth%.inf.tmp" "%pth%.inf"
  23. del /f /q *.tmp
复制代码
附件:SRCHASST.IN_原件,UNICODE文本,上传时加了个.inf扩展名,使用前删除掉。
作者: hanyeguxing    时间: 2010-12-28 21:06

把eol=后面的字符改成别的,然后重新编辑帖子
作者: stance    时间: 2010-12-28 21:19     标题: 祝贺寒夜荣任版主!这下大家有福了。

原来是eol=后边的字符造成的。又学了一招。我干脆把它去掉了。
作者: hanyeguxing    时间: 2010-12-28 21:28

  1. @echo off
  2. type "SRCHASST.inf">tmp
  3. findstr /v /b "msgr3en.dll nls302en.lex courtney.acs earl.acs rover.acs" tmp>"SRCHASST.inf"
  4. del tmp
复制代码

作者: stance    时间: 2010-12-28 21:41     标题: 原标题有毛病,问题被误解,又要被锁了。赶快改过来。

谢谢寒夜版主!但是,我想学会用FOR来处理文本内容,因为还有些文本存在大量删除、修改行的情况。
我还想搞懂为什么hy=!hy:~0=!这一句不被识别。

[ 本帖最后由 stance 于 2010-12-28 22:36 编辑 ]
作者: hanyeguxing    时间: 2010-12-28 22:58

  1. @echo off&setlocal enabledelayedexpansion
  2. set pth=SRCHASST
  3. for %%a in (msgr3en.dll nls302en.lex courtney.acs earl.acs rover.acs) do set #"%%a,,,32"==
  4. type "%pth%.inf">"%pth%.tmp"
  5. (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%pth%.tmp"') do if "%%b"=="" (echo/) else (
  6.     if not defined #"%%b" echo %%b
  7. ))>"%pth%.inf"
  8. del "%pth%.tmp"
复制代码

作者: stance    时间: 2010-12-28 23:30     标题: 寒夜版主辛苦了!

哦,是逗号在FOR中被视为分隔符造成的吧。要执行FOR,得先处理它。

set #"%%a,,,32"== 这一句中的#不太理解,看了FOR和SET帮助,里面没有讲到#号。它在程序里出现两次,是用来指定#号所指示的字符串的吗?
作者: hanyeguxing    时间: 2010-12-28 23:58

1,不推荐在本例中使用,作为for /f的分隔符,因为文本中存在,和,,,的不同情况。
2,加#防止文本内容被定义变量名时可能与set原有的默认变量名冲突。
作者: stance    时间: 2010-12-29 00:02

太感谢了!又学会了用#号。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2