пакет Windows для разделения строки при первом появлении разделителя - PullRequest
0 голосов
/ 31 мая 2019

У меня есть строка параметра, прочитанная из файла свойств.Одно из свойств показано ниже:

"CUSTOM_JAVA_OPTIONS=-Dhttp.proxyHost=webcache.example.com -Dhttp.proxyPort=8080"

Мне нужно разделить эту строку при первом появлении «=» и установить параметр со значением:

-Dhttp.proxyHost=webcache.example.com -Dhttp.proxyPort=8080

Япопытка сначала разбить строку на токене =, а затем удалить токен подстроки fist из исходной строки.В приведенном ниже коде %% 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

Ответы [ 3 ]

3 голосов
/ 31 мая 2019

Это можно упростить до:

@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 вам не нужно включать отложенное расширение.

1 голос
/ 31 мая 2019

Ваш код завершается сбоем полностью, потому что %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==! не будет работать, поскольку строки поиска останавливаются при первом появлении =, поэтому результатis ==-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.

0 голосов
/ 31 мая 2019

Если первый символ после символа = всегда равен -, то следующий метод также может работать для вас:

@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

Суть в том, чтобы просто показать вам информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...