- @echo off
- :: 保留空行替换字符串
- :: 当行首有冒号时会抛掉最开始的几个连续冒号(这个问题可以解决)
- :: 会忽略以分号开头的行
- :: 不能正确处理感叹号(因为启用了变量延迟)
- :: code by jm modify on 2006-11-1
- :: 出处:http://www.cn-dos.net/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!