返回列表 发帖

[文本处理] 求助BAT脚本批量替换指定扩展名内的字符串

目录内有很多html文件, 1.html, 2.html.....
需要替换目录内所有html扩展名文件内的指定文本路径 C:\A.jpg 为 D:\B.PNG

在论坛内找了很多帖子, 没有找到解决办法, 还请各位大佬帮帮忙


找到了一个, 但不知道为什么运行有错误, 无法完成需求.
@echo off
for /f "delims=" %%i in ('dir /s/b *.txt') do (
        for /f "delims=" %%a in ('type "%%~fi"') do (
                set "foo=%%a"
                call,set foo=%%foo:替换前内容=替换后内容%%
                call,echo/%%foo%%>>"%%~fi._"
)
move "%%~fi._" "%%~fi"
)
exitCOPY

找个一个VBS可以完成我的需求, 贴上代码
Set WshShell = CreateObject("Wscript.Shell")
WshShell.Run "cmd /c dir /s/b *.HTM > list.txt",vbHide
Wscript.Sleep 1000
sFile = "list.txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set oFile = objFSO.OpenTextFile(sFile,1)
Do While Not oFile.AtEndOfStream
      strLine = oFile.ReadLine
      If Len(strLine) > 0 Then
            Set File = objFSO.OpenTextFile(strLine, 1)
            aryLines = File.ReadAll
            File.Close
            aryLines = Replace(aryLines, "c:\A.jpg", "d:\B.png")
            Set File = objFSO.OpenTextFile(strLine, 2)
            File.Write aryLines
            File.Close
      End If
Loop
oFile.Close
objFSO.DeleteFile sFile
Set objFSO = NothingCOPY

TOP

本帖最后由 aloha20200628 于 2024-12-7 11:41 编辑

回复 1# akari

用 for+sed 一行流》直接修改源文件 *.html,以下代码存为 test.bat 运行,与 *.html, sed.exe 同目录...
sed.exe 可从本坛第三方下载(落地即用,存于 *.html 同目录)http://bcn.bathome.net/s/tool/index.html?key=sed
@for /f "delims=" %%F in ('dir /b/a-d *.html') do sed -i "s/c\:\\a\.jpg/d\:\\b\.png/gi" "%%F"
pause&exit/bCOPY

TOP

回复 3# aloha20200628


    谢谢! 但我希望不使用额外的程序处理文本.

TOP

批处理替换文本指定字符串

@echo off
for %%i in (*.html) do (
(for /f "delims=" %%a in ('find /n /v "" ^< "%%i"') do (
set str=%%a
setlocal enabledelayedexpansion
set "str=!str:C:\A.jpg=D:\B.PNG!"
echo=!str:*]=!
endlocal
)) > $
move $ "%%i"
)
pauseCOPY
1

评分人数

    • akari: 可以, 不过速度有些慢技术 + 1
bat小白,请多指教!谢谢!

TOP

本帖最后由 aloha20200628 于 2024-12-7 12:11 编辑

回复 4# akari

以下是纯批版本...
@echo off &for /f "delims=" %%F in ('dir /b/a-d *.html') do (
    (for /f "usebackq delims=" %%s in ("%%F") do (
         set "s=%%s" &setlocal enabledelayedexpansion
         echo,!s:c:\a.jpg=d:\b.png!&endlocal))>"-.-"
    move /y "-.-" "%%F")
pause&exit/bCOPY

TOP

感谢各位大神的帮助!
放弃了, 批处理相较于vbs来讲还是太慢太慢, vbs瞬间解决的问题批处理需要好久

TOP

回复 7# akari


    最重要的不是快或慢,html文件里面可能包含很多特殊字符,BAT脚本不适合。如果你会VBS就开心的用起来,挺好的。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 aloha20200628 于 2024-12-7 18:24 编辑

回复 7# akari

批处版本是逐行处理,vbs版本是逐件(以文件为单位)处理,可见效率之差...
试试以下两个版本,均以文件为单位处理,效率明显高于批处版本。第二个版本首启略慢,但调用了.net的高速读写功能,处理大数据时可能会优势突显...
以下代码存为 test-1.bat 运行
2>1/* ::
@echo off & dir /b/s/a-d *.html>"-.-" & (cscript /nologo /e:jscript "%~f0" "-.-")
del/q "-.-" &pause&exit/b */
v=WSH.arguments, fso=WSH.createObject('scripting.filesystemobject'), fr=fso.opentextfile(v(0),1);
while (!fr.atendofstream) {
F=fr.readline(), f=fso.opentextfile(F,1), a=f.readall(), f.close();
f=fso.opentextfile(F,2,true), f.write(a.replace(/c:\\a.jpg/gi, 'd:\\b.png')), f.close(); }
fr.close(),WSH.quit();COPY
以下代码存为 test-2.bat 运行
<# ::
@echo off &powershell "iex(${%~f0}|out-string)" &pause&exit/b
#>
dir *.html -recurse|%{ $s=[io.file]::readalltext($_,[text.encoding]::'default'); $s=$s -replace 'c:\\a.jpg', 'd:\b.png'; [io.file]::writeAlltext($_, $s,[text.encoding]::'default') }; exitCOPY

TOP

回复 8# Batcher


    感谢解惑!

TOP

回复 9# aloha20200628


    感谢您的帮助, 祝好运!

TOP

返回列表