@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
,这意味着文件的d
rive、p
ath 和n
ame %%i
。引用它是为了处理文件名或路径名中的潜在空格。
下一个逻辑语句是(for /f...[lines] )>!outfile!
将任何echo
ed 文本发送到 NEW 文件!outfile!
。批处理的enabledelayedexpansion
第二个物理行中!outfile!
的 RUN-TIME 值 - 因为它在FOR r
外部循环中更改。
由于 %%i 中的实际 HTML 文件名可能包含空格,因此需要引用它,因此FOR/F
. 该delims=
子句确保将文件中的 ENTIRE 行"%%i"
应用于%%L
- 而不仅仅是第一个标记(实际上,使整行成为第一个标记)。
该SET
命令用字符串“/test/”替换变量的 RUN-TIME 值中出现的任何“/live/”,line
并将结果分配给line
. 结果值是ECHO
d - 被重定向到outfile
请注意,在您的原始文件中,您将在PARSED中进行分配x
,set x=
但echo %x%
会按原样进行复制,因为在解析阶段,批处理将任何变量的值替换为 %var% 。x
因此,该行将变得简单ECHO
(因为x
可能未分配)并且奇怪地会报告echo
状态(Echo is OFF
)
这里有几个问题。首先,%
众所周知,其他一些字符很难用批处理来处理,所以要小心。接下来,FOR/F
将绕过空行。如果需要,这可以克服。第三,这将/live/
在任何情况下用/test/
祝你好运!
编辑以支持感叹号:20130711T0624Z
添加SETLOCAL enabledelayedexpansion
行和ENDLOCAL
之前)>!outfile!
匹配