用批处理实现文本文件中指定字符串的替换 zz

               
主题 用批处理实现文本文件中指定字符串的替换 « 上一主题 | 下一主题 »
uglyfrog
发表于:2005-03-02 02:50 回复
发帖: 249
积分: 0
注册: 2001-12-30
其实批处理也可以干很多事的,下面的批处理文件实现了对指定目录下的特定文件类型中的字符串进行替换的功能。虽然在unix或linux系统写一条语句就能实现,但在windows下用批处理也总比编一段程序方便些吧。

引用


@echo off



setlocal



rem DPATH   : 指定目录

rem FILETYPE: 指定文件类型

rem SCONTENT: 替换前的字符串

rem DCONTENT: 替换后的字符串

rem TMPFILE : 临时文件



set DPATH=c:/test

set FILETYPE=*.txt

set SCONTENT=aaa

set DCONTENT=bbb

set TMPFILE=%random%.tmp



for /r %DPATH% %%i in ( %FILETYPE% ) do (



    if exist %TMPFILE% ( del /f/q %TMPFILE% )



    for /f "tokens=*" %%j in (%%i) do (

      set TMP=%%j

      echo !TMP:%SCONTENT%=%DCONTENT%! >> %TMPFILE%

    )



    move /y %TMPFILE%  %%i

)



endlocal



把以上内容保存为replace.bat,然后在命令行下执行cmd /v:on /c replace.bat
本例子实现了把c:/test目录(包括子目录)中所有txt文件中的aaa替换成bbb。
zzzevazzz
发表于:2005-03-02 12:53 回复
发帖: 275
积分: 0
注册: 2002-05-13
完全不行,。楼主你测试过没有啊?
首先,对带空格的文件无法正确运行。
而且,“echo !TMP:%SCONTENT%=%DCONTENT%! >> %TMPFILE%”是什么意思?
被替换的文件都成这样了:
!TMP:aaa=bbb!  
!TMP:aaa=bbb!  
!TMP:aaa=bbb!
---
Ph4nt0m Security Team
http://ph4nt0m.org/
uglyfrog
发表于:2005-03-02 14:21 回复
发帖: 249
积分: 0
注册: 2001-12-30
不好意思,我所给出的bat只是简单演示了它具有这种功能。并没有经过太严格的测试。如果有谁有兴趣的话,可以继续完善或发掘新的功能。

至于zzzevazzz所说的替换的内容不对,我用的系统是2000的,不知道你的是什么。如果你的系统也是2000的话,可以参见cmd和set命令的帮助部分,查看有关了延迟环境变量的内容。别忘了在执行bat文件的同时加上cmd的/v:on参数。别的系统我没试过。我想2000以后的系统应该都有这个特性。

还有就是如果我连自己都试过完全不行的话我也不会发上来了,不过还是要谢谢你,因为你帮我指出了其中的问题。同时向你学习,因为你对待事物的严谨态度。
zzzevazzz
发表于:2005-03-02 22:21 回复
发帖: 275
积分: 0
注册: 2002-05-13
我没注意到“cmd /v:on /c”,抱歉。
但是还有问题,被替换的文本在行尾多了许多的空格,原因是
echo !TMP:%SCONTENT%=%DCONTENT%! >> %TMPFILE%
这条语句的">>"前多了不必要的空格。

文件名带空格的问题容易解决,下面是我修改过的:

@echo off
setlocal

rem DPATH   : 指定目录
rem FILETYPE: 指定文件类型
rem SCONTENT: 替换前的字符串
rem DCONTENT: 替换后的字符串
rem TMPFILE : 临时文件

set DPATH=C:/test
set FILETYPE=*.txt
set SCONTENT=aaa
set DCONTENT=bbb
set TMPFILE=%random%.tmp

for /r %DPATH% %%i in (%FILETYPE%) do (
    if exist %TMPFILE% (del /f/q %TMPFILE%)
    for /f "usebackq tokens=*" %%j in ("%%i") do (
      set TMP=%%j
      echo !TMP:%SCONTENT%=%DCONTENT%!>>%TMPFILE%
    )
    move /y %TMPFILE% "%%i"
)

endlocal
---
Ph4nt0m Security Team
http://ph4nt0m.org/
uglyfrog
发表于:2005-03-03 00:10 回复
发帖: 249
积分: 0
注册: 2001-12-30
晚上抽空又看了一下。那句echo在批处理中总是解析成
echo !TMP:aaa=bbb!  1>>25417.tmp,所以会在行尾多一个空格。
所以可以用如下的方法解决:
echo !TMP:%SCONTENT%=%DCONTENT%!>nul 1>>%TMPFILE%

还有那个文件名中有空格的问题,你的处理方法不错,充分利用了usebackq的特性。也可以变通的用:
for /f "tokens=*" %%j in ('type "%%i"') 来搞定。
allyesno
发表于:2005-06-17 09:21 删除 编辑 回复
发帖: 1128
积分: 0
注册: 2003-06-06
bat的功能还是太弱了

如果只是字母和数字 这个程序还可以执行

如果文本包含^&":;<> 这些字符 处理起来很麻烦

没有专门对字符 和字符串 操作的函数 也不具备多线程的性能 也不能读写内存 呵呵

allyesno 编辑于 2005-06-17 09:24
---
▄︻┻┳═一
QQ溢出了~~~~
           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

猜你喜欢

转载自blog.csdn.net/qq_43667702/article/details/87442131
zz