[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

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

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


找到了一个, 但不知道为什么运行有错误, 无法完成需求.
  1. @echo off
  2. for /f "delims=" %%i in ('dir /s/b *.txt') do (
  3.         for /f "delims=" %%a in ('type "%%~fi"') do (
  4.                 set "foo=%%a"
  5.                 call,set foo=%%foo:替换前内容=替换后内容%%
  6.                 call,echo/%%foo%%>>"%%~fi._"
  7. )
  8. move "%%~fi._" "%%~fi"
  9. )
  10. exit
复制代码

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

回复 7# akari

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

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

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

TOP

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

回复 4# akari

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

TOP

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

  1. @echo off
  2. for %%i in (*.html) do (
  3. (for /f "delims=" %%a in ('find /n /v "" ^< "%%i"') do (
  4. set str=%%a
  5. setlocal enabledelayedexpansion
  6. set "str=!str:C:\A.jpg=D:\B.PNG!"
  7. echo=!str:*]=!
  8. endlocal
  9. )) > $
  10. move $ "%%i"
  11. )
  12. pause
复制代码
1

评分人数

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

TOP

回复 3# aloha20200628


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

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
  1. @for /f "delims=" %%F in ('dir /b/a-d *.html') do sed -i "s/c\:\\a\.jpg/d\:\\b\.png/gi" "%%F"
  2. pause&exit/b
复制代码

TOP

找个一个VBS可以完成我的需求, 贴上代码
  1. Set WshShell = CreateObject("Wscript.Shell")
  2. WshShell.Run "cmd /c dir /s/b *.HTM > list.txt",vbHide
  3. Wscript.Sleep 1000
  4. sFile = "list.txt"
  5. Set objFSO = CreateObject("Scripting.FileSystemObject")
  6. Set oFile = objFSO.OpenTextFile(sFile,1)
  7. Do While Not oFile.AtEndOfStream
  8.       strLine = oFile.ReadLine
  9.       If Len(strLine) > 0 Then
  10.             Set File = objFSO.OpenTextFile(strLine, 1)
  11.             aryLines = File.ReadAll
  12.             File.Close
  13.             aryLines = Replace(aryLines, "c:\A.jpg", "d:\B.png")
  14.             Set File = objFSO.OpenTextFile(strLine, 2)
  15.             File.Write aryLines
  16.             File.Close
  17.       End If
  18. Loop
  19. oFile.Close
  20. objFSO.DeleteFile sFile
  21. Set objFSO = Nothing
复制代码

TOP

返回列表