Board logo

标题: 已解决--批量修改当前目录中 TXT文件 [打印本页]

作者: gongcctv     时间: 2008-2-19 23:14    标题: 已解决--批量修改当前目录中 TXT文件
高手。。请教。。我想批量修改目录中 TXT文件内容中的自身的路径(TXT文件内容含有自身的路径),怎么修改。。。 举个例子:比如说当前为A 目录。 A根目录下有123.txt 456.txt等文件,而123.txt与 456.txt其文本内容中又含有"A\"等字样,而我就是要把TXT中的“A\”改成“B\"或者其它 而其中的目录名"A"需要去截取 就是说。。。不只要处理A一个目录中的文本。。还有B 、C。。等目录。。。。 C目录中的文本中的 C\ 改成 B\ B目录中的就是改成自身,也就是等于没改。。。。 我在网上找的可以参考的例子: @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 :on /c replace.bat 本例子实现了把c:\test目录(包括子目录)中所有txt文件中的aaa替换成bbb。 还有一个获得当前目录名的参考例子 @echo off for /f "delims=" %%i in ("%cd%") do ( if %%i EQU %%~di\ ( echo %%~di ) else ( echo %%~ni ) ) pause>nul 刚学批处理。。。不知道我是否表述清楚。。。高手请指教。。。(如果可以的话,希望能附上注释) 谢谢!! 回楼下的话: 但是怎么获取当前目录的名字呢,不好意思,我很菜,就算获得了目录名如何把上面两个批处理组合到一起。。。。。而且我如果处理很多不同的目录呢?好像很难。。。。。。继续求救中。。。。 另一个参考例子 @echo off :: 保留空行替换字符串 :: 当行首有冒号时会抛掉最开始的几个连续冒号(这个问题可以解决) :: 会忽略以分号开头的行 :: 不能正确处理感叹号(因为启用了变量延迟) :: code by jm modify on 2006-11-1 :: 出处:www.cn-dos.net/forum/viewthrea ... 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%" 版主啊。。。就是强。。。牛叉人物!!! 改好了 @echo off & SetLocal EnableDelayedExpansion for /f "delims=" %%a in ('dir /b/s/a-d .\*.html .\*.ini') do ( for /f "delims=" %%b in ("%%a\..") do (set dirname=%%~nxb) for /f "usebackq delims=" %%c in ("%%~a") do ( set string=%%c call set string=%%string:!dirname!=B\%% echo.!string!>>temp.txt ) del "%%~a" && move temp.txt "%%~a" ) pause 下接5楼 [ Last edited by gongcctv on 2008-2-20 at 11:59 PM ]

作者: lxmxn     时间: 2008-2-19 23:35
set DPATH=c:\test set FILETYPE=*.txt set SCONTENT=aaa set DCONTENT=bbb
你只需要修改这些就好了。

作者: gongcctv     时间: 2008-2-19 23:39
但是怎么获取当前目录的名字呢,不好意思,我很菜,就算获得了目录名如何把上面两个批处理组合到一起。。。。。而且我如果处理很多不同的目录呢?好像很难。。。。。。继续求救中。。。。 [ Last edited by gongcctv on 2008-2-19 at 11:41 PM ]

作者: moniuming     时间: 2008-2-20 20:44
%cd%

作者: gongcctv     时间: 2008-2-20 23:56    标题: 感谢版主的耐心帮忙,谢谢
感谢版主的耐心帮忙,谢谢 我将过程帖出来,希望能帮到一些朋友们。。谢谢 @echo off & SetLocal EnableDelayedExpansion for /f "delims=" %%a in ('dir /b/s/a-d .\*.txt') do ( for /f "delims=" %%b in ("%%a\..") do (set dirname=%%~nxb) for /f "usebackq delims=" %%c in ("%%~a") do ( set string=%%c call set string=%%string:!dirname!\=%% echo.!string!>>temp.txt ) del "%%~a" && move temp.txt "%%~a" ) rem 版主。。。还有一个小小小问题。。。。如果我要处理 “目录名\" 这个"\"要加在哪啊。。(加 rem 在!dirname!后面) rem 只能修改没有特殊符号的文件夹里的东东 pause rem 我把里面的b\ 去掉后会出现错误。。。。 因为我想有时候会想把那个 “目录名\"删掉而不是替换掉。。。 RE: 那你就去掉b\\ (这个版本对文件夹有特殊字符不能处理会出现错误,下面的版要用到sed.exe) 用sed 版本1 @echo off & SetLocal EnableDelayedExpansion for /f "delims=" %%a in ('dir /b/s/a-d .\*.htm') do ( for /f "delims=" %%b in ("%%a\..") do (set dirname=%%~nxb) sed "s/!dirname!\\/B\\/g" "%%~a" > temp.txt del "%%~a" && move temp.txt "%%~a" ) 如果想要修改的是不是"目录然\"而是"目录名/" sed "s/!dirname!\\/B\\/g" "%%~a" > temp.txt 修改成 sed "s/!dirname!\//B\//g" "%%~a" > temp.txt 天下苍狼 22:39:23 如果删除的话是不是就去掉 B\ ?? bat版主 22:39:36 嗯 天下苍狼 22:39:46 sed "s/!dirname!\////g" "%%~a" > temp.txt 这样是吧。。 bat版主 22:40:14 去掉最后一个/ 版本2 测试未通过 @echo off for /f "delims=" %%a in ('dir /b/s/a-d .\*.html .\*.ini') do ( for /f "delims=" %%b in ("%%a\..") do (set dirname=%%~nxb) pushd "%%~dpa" SetLocal EnableDelayedExpansion sed "s:!dirname!::g" "%%~nxa"|more>temp.txt popd&endlocal del "%%~a" && move temp.txt "%%~a" ) [ Last edited by gongcctv on 2008-2-21 at 12:01 AM ]