Побег двойной кавычки в опции `delims` для `for /F`

У меня небольшие проблемы с пакетным сценарием, который должен разобрать значение из конфигурационного файла на переменную.

Достаточно анонимизированный, соответствующая строка файла выглядит как

<?define ProductShortName="Foo" ?>

Я хочу установить переменную на Foo. Строка ProductShortName достаточно уникальна, чтобы получить строку с findstr, но тогда я должен извлечь значение. Правильный подход кажется для /F, но все это дает ошибки:

for /F "delims=^" usebackq" %%G in (`findstr /L "ProductShortName" "%~dp0Installer\Branding.wxi"`)
for /F "delims="" usebackq" %%G in (`findstr /L "ProductShortName" "%~dp0Installer\Branding.wxi"`)
for /F "delims=\" usebackq" %%G in (`findstr /L "ProductShortName" "%~dp0Installer\Branding.wxi"`)
for /F 'delims=^" usebackq' %%G in (`findstr /L "ProductShortName" "%~dp0Installer\Branding.wxi"`)
for /F 'delims=" usebackq' %%G in (`findstr /L "ProductShortName" "%~dp0Installer\Branding.wxi"`)
for /F "delims=" usebackq" %%G in (`findstr /L "ProductShortName" "%~dp0Installer\Branding.wxi"`)

в основном вдоль строк

usebackq" %G in (`findstr /L "ProductShortName" "C:\foo\bar\Installer\Branding.wxi"`) was unexpected at this time.

Какой правильный способ экранирования, чтобы разделить строку на "?

30
задан Peter Taylor 22 September 2011 в 14:04
поделиться

2 ответа

Я не верю, что это возможно - цитата (") не может быть использована в качестве разделителя.

Однако одним из решений является сохранение всей строки в переменной окружения и использование встроенной функциональности «replace» из set для замены кавычки чем-то другим - например, _. Затем можно использовать другой цикл for только для этой строки, чтобы разделить новый разделитель:

setlocal EnableDelayedExpansion
for /f "tokens=* usebackq" %%a in (`...`) do (
    set z=%%a
    set z=!z:"=_!
    for /f "tokens=1-3 delims=_" %%a in ("!z!") do echo %%b
)

Небольшое объяснение ... первый цикл for получает всю строку в переменную %a. Затем это копируется в переменную z. z затем устанавливается снова, используя встроенную функциональность поиска / замены наборов (обратите внимание, что здесь мы ссылаемся на переменную, используя !z:"=_!, который выполняет замену). Наконец, мы анализируем эту единственную строку, чтобы получить элемент между кавычками.

Надеюсь, в этом есть какой-то смысл.

5
ответ дан 27 November 2019 в 23:55
поделиться

Я думаю, что в основном легче найти символы, которые окружают кавычки, и удалить цитату на более позднем этапе. Если мы хотим извлечь значения из определенной строки в XML-файле

<line x0="745" y0="1162" x1="1203" y1="1166"/>

Мы поступим следующим образом

SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "tokens=3,5,7,9 delims==/ " %%i IN ('FINDSTR line %1') DO (
SET x0=%%~i
SET y0=%%~j
SET x1=%%~k
SET y1=%%~l
)

В общем, кавычки не являются реальными разделителями для себя, поэтому это будет добиваться цели в большинстве случаев.

0
ответ дан 27 November 2019 в 23:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: