中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 已解决--批量修改当前目录中 TXT文件
作者:
标题: 已解决--批量修改当前目录中 TXT文件 上一主题 | 下一主题
gongcctv
新手上路





积分 12
发帖 4
注册 2006-11-1
状态 离线
『楼 主』:  已解决--批量修改当前目录中 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 ]

2008-2-19 23:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 2 楼』:  



  Quote:
set DPATH=c:\test
set FILETYPE=*.txt
set SCONTENT=aaa
set DCONTENT=bbb

你只需要修改这些就好了。

2008-2-19 23:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
gongcctv
新手上路





积分 12
发帖 4
注册 2006-11-1
状态 离线
『第 3 楼』:  

但是怎么获取当前目录的名字呢,不好意思,我很菜,就算获得了目录名如何把上面两个批处理组合到一起。。。。。而且我如果处理很多不同的目录呢?好像很难。。。。。。继续求救中。。。。

[ Last edited by gongcctv on 2008-2-19 at 11:41 PM ]

2008-2-19 23:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
moniuming
银牌会员

永远的菜鸟



积分 1335
发帖 574
注册 2007-11-27
来自 广西
状态 离线
『第 4 楼』:  

%cd%

2008-2-20 20:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复
gongcctv
新手上路





积分 12
发帖 4
注册 2006-11-1
状态 离线
『第 5 楼』:  感谢版主的耐心帮忙,谢谢

感谢版主的耐心帮忙,谢谢
我将过程帖出来,希望能帮到一些朋友们。。谢谢
@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 ]

2008-2-20 23:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: