有超过10个带图像标记的html文件。每次我们将构建部署到测试站点时,我们都需要更改img源。例如<img src=/live/Content/xyz.png />
至<img src=/test/Content/xyz.png />
环顾四周并阅读了一段时间之后,我想出了以下批处理脚本,但是我无法弄清楚如何从这里继续前进:
for /r %%i in (*.html) do echo %%i
for %%f in (*.html) do (
FOR /F %%L IN (%%f) DO (
SET "line=%%L"
SETLOCAL ENABLEDELAYEDEXPANSION
SET "x= <--------------------WHAT DO I SET HERE?
echo %x%
ENDLOCAL )) pause
这是我的第一个批处理脚本,有人可以指导我朝正确的方向发展吗?
答案 0 :(得分:0)
@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
前缀获取i
,表示文件d
的{{1}}铆钉,p
和n
ame。引用它来处理文件名或路径名中的潜在空格。
下一个逻辑语句是%%i
,它将任何(for /f...[lines] )>!outfile!
ed文本发送到新文件echo
。批处理的第二个物理行中的!outfile!
使enabledelayedexpansion
成为RUN-TIME值 - 因为它在!outfile!
外循环中发生了变化。
由于%% i中的实际HTML文件名可能包含空格,因此需要引用它,因此FOR r
中的'usebackq'子句。 FOR/F
子句确保文件delims=
中的ENTIRE行应用于"%%i"
- 而不仅仅是第一个令牌(实际上,将整行作为第一个令牌)。
%%L
命令将字符串“/ test /”替换为变量SET
的RUN-TIME值中出现的“/ live /”,并将结果赋给{{1} }。然后,结果值为line
d - 重定向到line
请注意,在您的原始文件中,您将在ECHO
中分配outfile
,但x
会在该行为PARSED时再现set x=
,因为批量替代%var%的任何变量的值作为解析阶段的一部分。因此,该行只会变为echo %x%
(因为x
可能会被取消分配)并且奇怪地会报告ECHO
州(x
)
这里有几个gatchas。首先,echo
和其他一些字符很难用批处理来处理,所以要小心。接下来,Echo is OFF
将绕过空行。如果需要,可以克服这个问题。第三,这将在任何情况下用%
FOR/F
的任何事件
祝你好运!
编辑以支持感叹号:20130711T0624Z
在/live/
之前添加/test/
行和SETLOCAL enabledelayedexpansion
以匹配