首页 > 解决方案 > 批处理文件:在文件中查找字符串并在之后添加文本

问题描述

我通常使用以下echo方法将“文本”写入HTML-file:

  echo. >> "C:\Users\Me\Desktop\test.html"
  echo  ^<div^>TestDIV^</div^> >> "C:\Users\Me\Desktop\test.html"

我经历过,echo总是将附加行写入目标文件的末尾。

但是,如果我的目标文件 ( test.html ) 已经具有如下结构怎么办:

<div id="wrapperDIV">
    <div id="DIVcontent1">DIV 1</div>
    <div id="DIVcontent2">DIV 2</div>
</div>

我想在这个现有结构中写下额外的行,例如在之后:

<div id="DIVcontent1">DIV 1</div>

我试图为此设置一个脚本,但到目前为止我无法让它运行。(它似乎在for-loop中失败)

set DIVInput=^<div^>TestDIV^</div^>

set inputfile=C:\Users\Me\Desktop\test.html

(for /f usebackq^ delims^=^ eol^=  %%a in ("%inputfile%") do (

   if "%%~a"=="DIV 1^</div^>" call echo %DIVInput%
   echo %%a 
))>>"%inputfile%"

pause

标签: batch-file

解决方案


set DIVInput=...使用了转义的插入符号,这在这种情况下很糟糕,因为您稍后需要将它echo正确地传递给变量。首选语法set "var=value"保留它们(它们在引用中是安全的)。

对于您的if行,您只想检查子字符串,而不是整行(if始终比较完整的字符串并且不支持通配符)。我曾经echo fullstring|find "string"检查过。请注意,我使用引号(echo "%%~a"') for the same reason as above: proper handling of poison chars like> and< Same reason for not escaping with thefind` 命令(“保存在引号内”)

您重定向到您的输入文件。重定向是解析器的第一件事,因此文件甚至在for有机会读取文件之前就被覆盖。使用不同的文件并在完成后覆盖您的原始文件。

您想在某个触发行之后插入一个字符串,但您的代码在该行之前插入(嗯,这很容易修复)。

@echo off
setlocal 
set "DIVInput=^<div^>TestDIV^</div^>"
set inputfile=test.html
(for /f usebackq^ delims^=^ eol^=  %%a in ("%inputfile%") do (
   echo %%a 
   echo "%%~a" |find "DIV 1</div>" >nul && echo     %DIVInput%
))>"%inputfile%.new"
REM move /y "%inputfile%.new" "%inputfile%

注意:move出于安全原因,我禁用了该命令。REM检查后删除test.html.new看起来没问题。


推荐阅读