Выход из знака равенства в команде замены пакетной строки DOS - PullRequest
2 голосов
/ 23 марта 2010

Мне нужно заменить некоторый текст в файле JNLP, используя пакетный файл DOS, чтобы настроить его для локального компьютера.

Проблема состоит в том, что шаблон поиска содержит знак равенства, который запутывает замену строки в пакетном файле.

Я хочу заменить строку,

<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)

но = в шаблоне поиска читается как часть команды замены.

Как мне избежать знака равенства, чтобы он обрабатывался как текст?

Ответы [ 4 ]

1 голос
/ 23 марта 2010

Лучшее решение - это загрузить и установить 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
===
1 голос
/ 07 апреля 2011

Нельзя просто заменить (подстроку) знаком равенства, не разбивая (оператор for с "delims==") или не обрезая…

Но, возможно, вы могли бы пойти на этот более простой, но более запутанный подход, используя следующий оператор в вашем цикле for:

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

Он просто объединяет строку для замены на то, что следует после вместо того, что идет до , избегаялюбые замены знака равенства полностью.

0 голосов
/ 18 июня 2014

Если вы можете передать аргументы как что-то еще, например, двойное подчеркивание, вы можете перебрать их и преобразовать в '=' в командном файле.

@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

0 голосов
/ 23 марта 2010

Вот альтернативное решение. Если вы можете позволить себе скачать инструменты GNU, вы можете использовать sed :

C:\test>set a=200
C:\test>sed -i.bak "s/^\(.*initial-heap-size=\"\).*\( max.*\)/\1%a%\"\2/" file 
...