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
:: 出处: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%"


版主啊。。。就是强。。。牛叉人物!!!
改好了


@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


  Quote:
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 ]