У меня небольшие проблемы с пакетным сценарием, который должен разобрать значение из конфигурационного файла на переменную.
Достаточно анонимизированный, соответствующая строка файла выглядит как
<?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.
Какой правильный способ экранирования, чтобы разделить строку на "
?
Я не верю, что это возможно - цитата ("
) не может быть использована в качестве разделителя.
Однако одним из решений является сохранение всей строки в переменной окружения и использование встроенной функциональности «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:"=_!
, который выполняет замену). Наконец, мы анализируем эту единственную строку, чтобы получить элемент между кавычками.
Надеюсь, в этом есть какой-то смысл.
Я думаю, что в основном легче найти символы, которые окружают кавычки, и удалить цитату на более позднем этапе. Если мы хотим извлечь значения из определенной строки в 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
)
В общем, кавычки не являются реальными разделителями для себя, поэтому это будет добиваться цели в большинстве случаев.