标题: 已解决--批量修改当前目录中 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 ]