@ECHO OFF
SETLOCAL enabledelayedexpansion
for /r U:\ %%i in (*.html) do (
echo found %%i
SET outfile="%%~dpni.lmth"
(
SETLOCAL disabledelayedexpansion
FOR /F "usebackq delims=" %%L IN ("%%i") DO (
SET "line=%%L"
SETLOCAL ENABLEDELAYEDEXPANSION
SET "line=!line:/live/=/test/!
echo !line!
ENDLOCAL
)
ENDLOCAL
)>!outfile!
)
pause
GOTO :EOF
这个发展怎么样?
注意:我已将您修改FOR/R为ECHO正在处理和使用的 HTML 文件,%%i而不是切换到%%f. U:是我的 RAMDRIVE;你需要修改它以适应。
outfile设置为生成与 HTML 文件名匹配的文件名,但带有.lmth扩展名(无法就地更新) - 它从~dpn前缀 the中获取i,这意味着文件的drive、path 和name %%i。引用它是为了处理文件名或路径名中的潜在空格。
下一个逻辑语句是(for /f...[lines] )>!outfile!将任何echoed 文本发送到 NEW 文件!outfile!。批处理的enabledelayedexpansion第二个物理行中!outfile!的 RUN-TIME 值 - 因为它在FOR r外部循环中更改。
由于 %%i 中的实际 HTML 文件名可能包含空格,因此需要引用它,因此FOR/F. 该delims=子句确保将文件中的 ENTIRE 行"%%i"应用于%%L- 而不仅仅是第一个标记(实际上,使整行成为第一个标记)。
该SET命令用字符串“/test/”替换变量的 RUN-TIME 值中出现的任何“/live/”,line并将结果分配给line. 结果值是ECHOd - 被重定向到outfile
请注意,在您的原始文件中,您将在PARSED中进行分配x,set x=但echo %x%会按原样进行复制,因为在解析阶段,批处理将任何变量的值替换为 %var% 。x因此,该行将变得简单ECHO(因为x可能未分配)并且奇怪地会报告echo状态(Echo is OFF)
这里有几个问题。首先,%众所周知,其他一些字符很难用批处理来处理,所以要小心。接下来,FOR/F将绕过空行。如果需要,这可以克服。第三,这将/live/在任何情况下用/test/
祝你好运!
编辑以支持感叹号:20130711T0624Z
添加SETLOCAL enabledelayedexpansion行和ENDLOCAL之前)>!outfile!匹配