batch-file - 批处理文件:在文件中查找字符串并在之后添加文本
问题描述
我通常使用以下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
解决方案
您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 the
find` 命令(“保存在引号内”)
您重定向到您的输入文件。重定向是解析器的第一件事,因此文件甚至在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
看起来没问题。
推荐阅读
- python - Python同步启动异步进程
- c++ - 猜词游戏 C++
- javascript - 为什么我无法在 Express 中获取 Auth 标头?
- python - Pyinstaller 离线 pip 安装不起作用
- azure - 使用 azure webapp 作为反向代理
- java - 使用 XMLUnit 比较 xml 文件时忽略特定节点的特定属性
- entity-framework - 通用存储库模式,还有其他选择吗?
- html - CSS:在响应视图中居中背景图像
- sql - PostgreSQL - 如何在竞争激烈的插槽竞赛中防止重复插入
- c# - C# MySql 在 where 子句中的未知列