分享

经典批处理分析(二)

 nxhujiee 2010-02-25
经典批处理分析(二) 收藏
 
@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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多