在 DOS 批处理字符串替换命令中转义等号

问题描述 投票:0回答:4

我需要使用 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)

但是搜索模式中的 = 正在作为替换命令的一部分被读取。

如何转义等号以便将其作为文本处理?

string dos batch-file
4个回答
1
投票

不能简单地替换(用子字符串)等号,而不拆分(用

"delims=="
进行 for 语句)或修剪......

但是也许您可以采用这种更简单但更令人困惑的方法,在 for 循环中使用以下语句:

set str=!str:"100M" max-heap-size="%min%M" max-heap-size!

它只是将要替换的字符串组合为 after 的内容,而不是 before 的内容,完全避免任何等号替换。


1
投票

最好的解决方案是下载并安装 CygwinGNUWin32,但是,如果你真的仅限于标准命令处理器,它可能会变得有点混乱。

这不是世界上最快的方法,但它至少是实用的。此命令文件一次处理每一行一个字符,特别处理您找到要查找的节的情况。

@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
===

0
投票

如果您可以将参数作为其他内容传递,例如双下划线,则可以迭代它们并将它们转换为批处理文件中的“=”。

@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%

来源:https://github.com/mlabbe/batchargs


-4
投票

这是一个替代解决方案。如果你有能力下载 GNU 工具,你可以使用 sed:

C:\test>set a=200
C:\test>sed -i.bak "s/^\(.*initial-heap-size=\"\).*\( max.*\)/\1%a%\"\2/" file 
© www.soinside.com 2019 - 2024. All rights reserved.