РЕДАКТИРОВАТЬ: Это неправильно, см. Мой комментарий позже : Как сказал Джои, похоже, нет возможности использовать кавычку в качестве разделителя, она может использоваться только как символ EOL.
Это кажетсябыть эффектом синтаксического анализатора FOR-LOOP cmd.exe, так как он сканирует часть параметров и останавливает сканирование после кавычки, только параметр EOL = прерывает это, поскольку он всегда читает следующий символ без каких-либо исключений.
Вы можете решить эту проблему с помощью обходного пути, например icabod.
Решение состоит в том, чтобы заменить кавычки неиспользуемым символом, но если вы хотите принять какой-либо символ внутри кавычек, там не будет неиспользованного символа.
Таким образом, мое решение сначала создает неиспользуемый символ, заменяя все предыдущие вхождения.
Я хочу использовать #
для замены кавычек, но для сохранения всех #
внутри кавычек и замены егораньше с $R
, но затем он может столкнуться с существующим $R
в тексте, поэтому я сначала заменяю все $
на $D
, затем он абсолютно свободен от столкновений.
После извлечения "цитируемого"текст, я должен заменить $ R и $ D на их исходные значения, вот и все.
@echo off
setlocal EnableDelayedExpansion
for /F "tokens=1,2" %%1 in ("%% #") DO (
for /f "tokens=* usebackq" %%a in ("datafile.txt") do (
set "z=%%a"
set "z=!z:$=$D!"
set "z=!z:#=$R!"
set "z=!z:"=#!"
for /f "tokens=1-3 delims=#" %%a in ("!z!") do (
set "value=%%b"
if defined value (
set "value=!value:$R=#!"
set "value=!value:$D=$!"
echo result='!value!'
)
)
)
)
Пример текста:
<?define ProductShortName="Two #$* $D $R" ?>
приводит к Two #$* $D $R
, как и ожидалось
РЕДАКТИРОВАТЬ: Есть способ!
Я всегда проверял такие вещи (и это не удается)
setlocal EnableDelayedExpansion
set "var=one"two"three"
FOR /F ^"tokens^=1-3^ delims^=^"^" %%a in ("!var!") do echo %%a--%%b--%%c
Но, удалив первую цитату, все работает.
setlocal EnableDelayedExpansion
set "var=one"two"three"
FOR /f tokens^=1-3^ delims^=^" %%a in ("!var!") do echo %%a--%%b--%%c