我需要使用 DOS 批处理文件替换 JNLP 文件中的一些文本,以针对本地计算机进行调整。
问题在于搜索模式包含等号,这会弄乱批处理文件中的字符串替换。
我想更换线,
<j2se version="1.5" initial-heap-size="100M" max-heap-size="100M"/>
具有初始和最大堆大小的特定设置。
例如我现在有,
for /f "tokens=* delims=" %%a in (%filePath%agility.jnlp) do (
set str=%%a
set str=!str:initial-heap-size="100M"=initial-heap-size="%min%M"!
echo !str!>>%filePath%new.jnlp)
但是搜索模式中的 = 正在作为替换命令的一部分被读取。
如何转义等号以便将其作为文本处理?
不能简单地替换(用子字符串)等号,而不拆分(用
"delims=="
进行 for 语句)或修剪......
但是也许您可以采用这种更简单但更令人困惑的方法,在 for 循环中使用以下语句:
set str=!str:"100M" max-heap-size="%min%M" max-heap-size!
它只是将要替换的字符串组合为 after 的内容,而不是 before 的内容,完全避免任何等号替换。
最好的解决方案是下载并安装 Cygwin 或 GNUWin32,但是,如果你真的仅限于标准命令处理器,它可能会变得有点混乱。
这不是世界上最快的方法,但它至少是实用的。此命令文件一次处理每一行一个字符,特别处理您找到要查找的节的情况。
@echo off
set init=50M
set max=75M
setlocal enableextensions enabledelayedexpansion
for /f "tokens=* delims=" %%a in (agility.jnlp) do (
set str1=%%a
call :morph
echo !str2!>>agility_new.jnlp
echo !str2!
)
endlocal
goto :eof
:morph
set str2=
:morph1
if not "x!str1!"=="x" (
if "!str1:~0,18!"=="initial-heap-size=" (
set str2=!str2!initial-heap-size="!init!"
set str1=!str1:~24!
goto :morph1
)
if "!str1:~0,14!"=="max-heap-size=" (
set str2=!str2!max-heap-size="!max!"
set str1=!str1:~20!
goto :morph1
)
set str2=!str2!!str1:~0,1!
set str1=!str1:~1!
goto :morph1
)
goto :eof
使用输入文件:
<j2se version="1.5" initial-heap-size="100M" max-heap-size="100M"/>
next line
===
你最终会得到:
<j2se version="1.5" initial-heap-size="50M" max-heap-size="75M"/>
next line
===
如果您可以将参数作为其他内容传递,例如双下划线,则可以迭代它们并将它们转换为批处理文件中的“=”。
@rem Replace __ with = in batch files.
@rem This works around the lack of equals signs in args
@rem args contains full args string with substitutions in place
setlocal enabledelayedexpansion
:argloop
if "%~1" NEQ "" (
set str=%~1
set out=!str:__==!
set %~1=!out!
set args=!args!!out!
SHIFT
goto :argloop
)
@rem Can now run program on a line on its own with just %args%
这是一个替代解决方案。如果你有能力下载 GNU 工具,你可以使用 sed:
C:\test>set a=200
C:\test>sed -i.bak "s/^\(.*initial-heap-size=\"\).*\( max.*\)/\1%a%\"\2/" file