经典批处理分析(二) 收藏
@echo off :: 保留空行替换字符串 :: 当行首有冒号时会抛掉最开始的几个连续冒号(这个问题可以解决) :: 会忽略以分号开头的行 :: 不能正确处理感叹号(因为启用了变量延迟) :: code by jm modify on 2006-11-1 :: 出处:http://www./forum/viewthread.php?tid=22033 set file=
set /p file= 请把要处理的文件拉到本窗口: set "file=%file:"=%" for %%i in ("%file%") do set "file=%%~fi" echo. set replaced= set /p replaced= 请输入即将被替换的内容: echo. set all= set /p all= 请输入替换字符串: cd.>"%file%_tmp.txt" setlocal enabledelayedexpansion for /f "tokens=1* delims=:" %%i in ('findstr /n .* "%file%"') do ( set str=%%j if not "!str!"=="" set "str=!str:%replaced%=%all%!" >>"%file%_tmp.txt" echo.!str! ) copy "%file%" "%file%_bak.txt" >nul 2>nul move "%file%_tmp.txt" "%file%" start "" "%file%" 这个批处理实现对一个文件的字符串替换。它使用了很多技巧,且听我慢慢道来: 首先,我觉得“set file=”这个是没有必要的,像是对变量的声明。第11行将双引号去除,这是很有必要的,因为file变量将作为for命令中的fileset,否则运行时会解释错误。13行,在echo后面加一个小点,这里实现一个空行显示。19行创建一个空白的文本文件作为文件交换的临时文件。这里cd命令后面又跟了一个小点,可以理解为这是切换到当前目录下,其实等于什么也没做。'findstr /n .* "%file%"'使用正则表达式查找文件里的字符串,/n表示显示行号, .*查找任意字符。命令执行结果作为for命令的处理对象。变量描述“tokens=1* delims=:”表示将处理对象中的一行按冒号为分隔符分成两块,%i表示第一块,其它部分由%j表示。这样,22行中的str变量里存储的将是没有行号和冒号的查找结果。23和24号就对变量于进行了变量替换,并将结果追加到临时文件中。26行的>nul 将结果重定向到空的设备当中,2>nul表示将错误的输出也重定向到空设备中,为的是不回显任何结果。最后一行,打开文件。 这里重点说明一下 2>nul :2在这里是句柄描述符,表示数据流输入输出的地址。 句柄 | 句柄的数字代号 | 说明 STDIN 0 键盘输入 STDOUT 1 输出到命令提示符窗口 STDERR 2 错误输出到命令提示符窗口 这是我们常用到的句柄。 这个批处理以交互的方式提供对文件里的字符串进行替换,稍加修改就可以适应于处理大批量的文件。
have fun! 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kudoo/archive/2008/09/14/2880266.aspx |
|