我编写了一个简单的脚本来查找和替换匹配的字符串。我在输出文件中遇到问题。以下是我的剧本
@echo off
setlocal ENABLEDELAYEDEXPANSION
for /f "tokens=1 delims=" %%a in ('FINDSTR "^applicationPort" "E:\BATCH-SCRIPTING\Version.txt"') do (
echo Installed version is %%a
set oldPort=%%a
)
for /f "tokens=1 delims=" %%b in ('FINDSTR "^applicationPort" "E:\BATCH-SCRIPTING\Sample.txt"') do (
echo Installed version is %%b
set newPort=%%b
)
set SEARCHTEXT="applicationPort=8080"
set REPLACETEXT="applicationPort=8090"
set file="E:\BATCH-SCRIPTING\Sample.txt"
for /f "tokens=1,* delims=]" %%A in ('"type %file% |find /n /v """') do (
set "line=%%B"
if defined line (
call echo %%line:%SEARCHTEXT%=%REPLACETEXT%%%>> %file%_new
) ELSE echo.
)
move /Y %file%_new %file% > nul
在我的输出文件中,预期输出应为:applicationPort=8090
,但我得到8080=applicationPort=8090=8080
。
任何人都可以帮我解决这个问题。
答案 0 :(得分:1)
看看第一轮变数扩张后你的关键替换线会是什么样的:
call echo %%line:%SEARCHTEXT%=%REPLACETEXT%%%>> %file%_new
变为
call echo %line:applicationPort=8080=applicationPort=8090%>>"E:\BATCH-SCRIPTING\Sample.txt"
搜索/替换解析器在它看到的第一个=
处结束搜索短语。因此,在CALL之后,它会搜索applicationPort
并将其替换为8080=applicationPort=8090
。完全合乎逻辑。
坏消息是绝对没有办法逃脱搜索词中的=
。 Replacing =
is extremely difficult using a batch file。有解决方案,但我不推荐它们。相反,我会使用我的hybrid JScript/batch utility called REPL.BAT。它是从XP开始在任何Windows机器上运行的纯脚本。它执行正则表达式搜索并替换stdin并将结果写入stdout。完整的文档嵌入在脚本中。
@echo off
type "E:\BATCH-SCRIPTING\Sample.txt"|repl "applicationPort=8080" "applicationPort=8090" >"E:\BATCH-SCRIPTING\Sample.txt_new"
move /y "E:\BATCH-SCRIPTING\Sample.txt_new" "E:\BATCH-SCRIPTING\Sample.txt"
REPL.BAT比使用纯批处理脚本更简单,更快速(也更强大)。