Этот пакетный код может использоваться для этой задачи:
@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 /?