У меня есть строка параметров, считанная из файла свойств. Одно из свойств выглядит следующим образом:
"CUSTOM_JAVA_OPTIONS=-Dhttp.proxyHost=webcache.example.com -Dhttp.proxyPort=8080"
Мне нужно разбить эту строку при первом появлении "=" и установить параметр со значением:
-Dhttp.proxyHost=webcache.example.com -Dhttp.proxyPort=8080
Я пытаюсь сначала разбить строку на токен =, а затем удалить первый токен подстроки из исходной строки. В приведенном ниже коде %%G будет установлено значение «CUSTOM_JAVA_OPTIONS», и я пытаюсь удалить это из исходной строки «TESTSTR».
@echo off
set "TESTSTR=CUSTOM_JAVA_OPTIONS=-Dhttp.proxyHost=webcache.example.com
-Dhttp.proxyPort=8080"
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "tokens=1,2 delims= = " %%G IN ("%TESTSTR%") DO (
echo Name=%%G
echo Value=%%H
set removestr=%%G
echo TESTSTR=!TESTSTR!
echo removestr=!removestr!
set "str=!TESTSTR:%removestr%=!"
echo str=!str!
)
pause
Вышеупомянутое не работает, выдает:
Name=CUSTOM_JAVA_OPTIONS
Value=-Dhttp.proxyHost
TESTSTR=CUSTOM_JAVA_OPTIONS=-Dhttp.proxyHost=webcache.example.com -Dhttp.proxyPort=8080
removestr=CUSTOM_JAVA_OPTIONS
str=TESTSTR:=
Ожидаемый результат должен быть:
str=-Dhttp.proxyHost=webcache.example.com -Dhttp.proxyPort=8080
Это можно упростить до:
@echo off
set "TESTSTR=CUSTOM_JAVA_OPTIONS=-Dhttp.proxyHost=webcache.example.com -Dhttp.proxyPort=8080"
FOR /F "tokens=1* delims= = " %%G IN ("%TESTSTR%") DO set "str=%%H"
echo TESTSTR=%TESTSTR%
echo.str=%str%
pause
Есть 2 токена:
1. Text up to 1st delimiter
2. Everything else after first delimiter (*)
Обратите внимание, что при отображении переменных за пределами цикла FOR вам не нужно включать отложенное раскрытие.
Если первым символом после символа =
всегда является -
, то вам также может подойти следующий метод:
@Echo Off
Set "TESTSTR=CUSTOM_JAVA_OPTIONS=-Dhttp.proxyHost=webcache.example.com -Dhttp.proxyPort=8080"
Set "REST=-%TESTSTR:*-=%"
Set "FIRST=%TESTSTR:- = "&:"%"
Set "FIRST=%FIRST:~,-1%"
Echo [%FIRST%] [%REST%] & Pause
Суть в том, чтобы просто показать вам информацию.
Ваш код полностью терпит неудачу, потому что %removestr%
расширяется при первоначальном анализе команды, и весь цикл (блок кода) анализируется одновременно. Таким образом, %removestr%
расширяется до значения, существовавшего до входа в ваш цикл. В вашем случае переменная не определена. Итак, !TESTSTR:%removestr%=!
становится !TESTSTR:=!
, которое в итоге становится TESTSTR:=
.
Вы становитесь ближе, если используете %%G
напрямую, вместо того, чтобы назначать переменную среды.set str=!TESTSTR:%%G=!
дает =-Dhttp.proxyHost=webcache.example.com -Dhttp.proxyPort=8080
Затем вы можете использовать set str=!str:~1!"
, чтобы удалить ведущий =
.
set str=!TESTSTR:%%G==!
не будет работать, потому что строки поиска останавливаются при первом появлении =
, поэтому результат ==-Dhttp.proxyHost=webcache.example.com -Dhttp.proxyPort=8080
Ответ RGuggisberg — самый удобный способ получить желаемый результат. (Вы можете захотеть и %%G
, и %%H
).
Однако технически он не ломается с первого раза =
. На самом деле он прерывается на первой строке смежных =
, потому что FOR /F не анализирует пустые токены.
Таким образом, for /f "tokens=1* delims= = " %%G in ("A==B==C")
дает A
вместо %%G
(верно) и B==C
(неверно) вместо %%H
. Правильное значение должно быть =B==C
.
Скорее всего, это всегда будет соответствовать потребностям ОП. Но ваше описание не совсем верно.
for /f "tokens=1* delims = " %%G in ("A==B")
дастA
иB
, когда правильный результат должен бытьA
и=B
.