经典批处理分析(二)

 
  1. @echo off
  2. :: 保留空行替换字符串
  3. :: 当行首有冒号时会抛掉最开始的几个连续冒号(这个问题可以解决)
  4. :: 会忽略以分号开头的行
  5. :: 不能正确处理感叹号(因为启用了变量延迟)
  6. :: code by jm modify on 2006-11-1
  7. :: 出处:http://www.cn-dos.net/forum/viewthread.php?tid=22033
  8. set file=
  9. set /p file=  请把要处理的文件拉到本窗口:
  10. set "file=%file:"=%"
  11. for %%i in ("%file%"do set "file=%%~fi"
  12. echo.
  13. set replaced=
  14. set /p replaced= 请输入即将被替换的内容:
  15. echo.
  16. set all=
  17. set /p all=  请输入替换字符串:
  18. cd.>"%file%_tmp.txt"
  19. setlocal enabledelayedexpansion
  20. for /f "tokens=1* delims=:" %%i in ('findstr /n .* "%file%"'do (
  21.     set str=%%j
  22.     if not "!str!"=="" set "str=!str:%replaced%=%all%!"
  23.     >>"%file%_tmp.txt" echo.!str!
  24. )
  25. copy "%file%" "%file%_bak.txt" >nul 2>nul
  26. move "%file%_tmp.txt" "%file%"
  27. 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!


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值