标题: [文本处理] 求助BAT脚本批量替换指定扩展名内的字符串 [打印本页]
作者: akari 时间: 2024-12-7 10:45 标题: 求助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"
- )
- exit
复制代码
作者: akari 时间: 2024-12-7 11:05
找个一个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 = Nothing
复制代码
作者: aloha20200628 时间: 2024-12-7 11:25
本帖最后由 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/b
复制代码
作者: akari 时间: 2024-12-7 11:36
回复 3# aloha20200628
谢谢! 但我希望不使用额外的程序处理文本.
作者: 77七 时间: 2024-12-7 11:50
批处理替换文本指定字符串
- @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"
- )
- pause
复制代码
作者: aloha20200628 时间: 2024-12-7 11:53
本帖最后由 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/b
复制代码
作者: akari 时间: 2024-12-7 13:55
感谢各位大神的帮助!
放弃了, 批处理相较于vbs来讲还是太慢太慢, vbs瞬间解决的问题批处理需要好久
作者: Batcher 时间: 2024-12-7 14:33
回复 7# akari
最重要的不是快或慢,html文件里面可能包含很多特殊字符,BAT脚本不适合。如果你会VBS就开心的用起来,挺好的。
作者: aloha20200628 时间: 2024-12-7 15:44
本帖最后由 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();
复制代码
以下代码存为 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') }; exit
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |