标题: [文本处理] [已解决]怎样用批处理FOR语句修改SRCHASST.INF文本? [打印本页]
作者: stance 时间: 2010-12-28 20:57 标题: [已解决]怎样用批处理FOR语句修改SRCHASST.INF文本?
我已经有了一个可以实现修改SRCHASST.INF文本的批处理(代码的第一部分,网站好像不让在一张帖子里写两个代码)。
现在想用FOR语句来简化它,也是为了学习。但新的语句无法通过。
问题出在set hy=!hy:~0=!这一句上。它要求删除%n%这一行。如果是修改产生一个有值的结果,这一句还行。但要输出空值,就不行了。请教怎么个改法才好呢?- 可用的原代码:
-
- @echo off&setlocal enabledelayedexpansion
- (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "SRCHASST.tmp"') do if "%%b"=="" (echo/) else (
- set "hy=%%b"
- if /i not "!hy:~0,7!"=="msgr3en" (
- if /i not "!hy:~0,8!"=="nls302en" (
- if /i not "!hy:~0,8!"=="courtney" (
- if /i not "!hy:~0,4!"=="earl" (
- if /i not "!hy:~0,5!"=="rover" (echo !hy!)
- ))))))>"SRCHASST.INF"
-
- 有问题的新代码:
-
- set pth=SRCHASST
- set n=msgr3en.dll nls302en.lex courtney.acs earl.acs rover.acs
- expand %pth%.in_ %pth%.inf
- type "%pth%.inf">"%pth%.tmp"
- @echo off&setlocal enabledelayedexpansion
- (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%pth%.tmp"') do if "%%b"=="" (echo/) else (
- set hy=%%b
- for %%c in (%n%) do if /i "!hy:~0,-5!"=="%%c" set hy=!hy:~0=!
- echo !hy!
- ))>"%pth%.inf.tmp"
- move /y "%pth%.inf.tmp" "%pth%.inf"
- 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
- @echo off
- type "SRCHASST.inf">tmp
- findstr /v /b "msgr3en.dll nls302en.lex courtney.acs earl.acs rover.acs" tmp>"SRCHASST.inf"
- del tmp
复制代码
作者: stance 时间: 2010-12-28 21:41 标题: 原标题有毛病,问题被误解,又要被锁了。赶快改过来。
谢谢寒夜版主!但是,我想学会用FOR来处理文本内容,因为还有些文本存在大量删除、修改行的情况。
我还想搞懂为什么hy=!hy:~0=!这一句不被识别。
[ 本帖最后由 stance 于 2010-12-28 22:36 编辑 ]
作者: hanyeguxing 时间: 2010-12-28 22:58
- @echo off&setlocal enabledelayedexpansion
- set pth=SRCHASST
- for %%a in (msgr3en.dll nls302en.lex courtney.acs earl.acs rover.acs) do set #"%%a,,,32"==
- type "%pth%.inf">"%pth%.tmp"
- (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%pth%.tmp"') do if "%%b"=="" (echo/) else (
- if not defined #"%%b" echo %%b
- ))>"%pth%.inf"
- 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 |