Чтение файла свойств, разделенных символами, из пакета - PullRequest
0 голосов
/ 20 декабря 2018

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

Все свойства не обязательно должны быть в отдельных строках, например:

PORT=9099;
URL=www.google.com;
DOMAIN=D1;USER_NAME=ADMIN;PASSWORD=PASS;
LOG_LEVEL=FINE;

Здесь третья строка имеетнесколько свойств в одной строке.

Как мне разобрать это?Я попробовал ниже, но он не разделяется после первого;для третьей строки

FOR /f "tokens=1,2 delims=;" %%a in (%parameterFile%) do (
echo a is %%a
echo b is %%b
FOR /F "tokens=1,2 delims==" %%G IN (%%b) DO (set %%G=%%H)  
)

1 Ответ

0 голосов
/ 20 декабря 2018

Этот пакетный код может использоваться для этой задачи:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
if not defined ParameterFile set "ParameterFile=%TEMP%\%~n0.tmp"
set "DeleteParameterFile="
if exist "%ParameterFile%" goto ParseParameterFile
set "DeleteParameterFile=1"
(
    echo PORT=9099;
    echo URL=www.google.com;
    echo DOMAIN=D1;USER_NAME=ADMIN;PASSWORD=PASS;
    echo LOG_LEVEL=FINE;
)>"%ParameterFile%"


:ParseParameterFile
for /F usebackq^ delims^=^ eol^= %%A in ("%ParameterFile%") do (
    set "Variable="
    for %%B in (%%A) do (
        if not defined Variable (
            set "Variable=%%B"
        ) else (
            call set "%%Variable%%=%%B"
            set "Variable="
        )
    )
)

rem Add more code here using the environment variables set from file.

if defined DeleteParameterFile del "%ParameterFile%"
endlocal

Внешний FOR с параметром /F анализирует текстовый файл, как определено переменной среды ParameterFile, указанной вдвойные кавычки, требующие использования опции usebackq, должны интерпретироваться как имя текстового файла построчно, всегда игнорируя пустые строки. FOR по умолчанию игнорирует строки, начинающиеся с точки с запятой, поскольку eol=; является значением по умолчанию для конца строки. FOR по умолчанию разделяет также текущую строку на подстроки, используя в качестве разделителей обычный пробел и символ горизонтальной табуляции, и назначает только первую строку, разделяющую пробел / табуляцию, указанной переменной цикла.

Поведение разделения строки иигнорирование строк, начинающихся с точки с запятой, здесь не требуется.По этой причине delims= определяет пустой список разделителей, запрещающих разделение строк, а eol= определяет отсутствие символа конца строки, в результате чего игнорируются только пустые строки.Параметры не могут быть указаны в этом случае в строке аргумента в двойных кавычках.По этой причине три параметра должны быть указаны в строке аргумента, в которой все пробелы и знаки равенства должны быть экранированы с помощью символа вставки ^, который должен интерпретироваться как буквенные символы, а не как разделители строк аргумента.

FOR интерпретирует горизонтальную табуляцию, нормальный пробел, пробел без перерывов (с десятичным знаком кодовой страницы OEM 255), знак равенства, запятую и точку с запятой при отсутствии внутри строки в двойных кавычках как разделители набора строк для обработкив цикле не используется опция /F.Таким образом, для данного примера можно проанализировать строку из файла, используя еще один цикл FOR .

Пожалуйста, прочитайте Как анализирует интерпретатор команд Windows (CMD.EXE)сценарии? На переменную среды, определенную / измененную в командном блоке, нельзя ссылаться в том же командном блоке с использованием синтаксиса %variable%, поскольку cmd.exe заменяет все %variable% на текущее значение variable уже при разборе всегоблок команд, начинающийся с ( и заканчивающийся соответствием ), что означает в данном случае перед выполнением внешней команды FOR .Временные решения: использование отложенного расширения переменной среды, использование подпрограммы или использование команды CALL и синтаксиса %%variable%%.

Строка call set "%%Variable%%=%%B" анализируется до call set "%Variable%=%B" перед выполнением внешнего FOR .Эта строка анализируется во время выполнения внутреннего FOR из-за команды CALL , заменяющей %Variable% текущим значением переменной окружения Variable перед выполнением команды SET .Таким образом, значение, присвоенное переменной цикла B на каждой четной итерации внутреннего цикла FOR , присваивается переменной среды с именем, определенным на каждой нечетной итерации внутреннего цикла FOR , иприсваивается переменной среды с именем Variable.

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

Переменные среды, определенные во внутреннем цикле FOR , доступны вплоть до команды ENDLOCAL , которая восстанавливает среду(переменные среды, текущий каталог, состояние расширений команд и состояние отложенного расширения) перед выполнением этого пакетного файла.

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

  • call /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...