Пакет Windows для разделения строки при первом появлении разделителя

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

"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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 225
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

Скорее всего, это всегда будет соответствовать потребностям ОП. Но ваше описание не совсем верно. for /f "tokens=1* delims = " %%G in ("A==B") даст A и B, когда правильный результат должен быть A и =B.

dbenham 31.05.2019 23:01

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

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

Другие вопросы по теме