0

有 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    

这是我的第一个批处理脚本,有人可以指导我正确的方向吗?

4

1 回答 1

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/RECHO正在处理和使用的 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中进行分配xset x=echo %x%会按原样进行复制,因为在解析阶段,批处理将任何变量的值替换为 %var% 。x因此,该行将变得简单ECHO(因为x可能未分配)并且奇怪地会报告echo状态(Echo is OFF

这里有几个问题。首先,%众所周知,其他一些字符很难用批处理来处理,所以要小心。接下来,FOR/F将绕过空行。如果需要,这可以克服。第三,这将/live/在任何情况下用/test/

祝你好运!


编辑以支持感叹号:20130711T0624Z

添加SETLOCAL enabledelayedexpansion行和ENDLOCAL之前)>!outfile!匹配

于 2013-07-11T03:30:37.537 回答