我有一个用分隔的属性文件;需要使用批处理脚本读取,并且属性将被设置为环境变量。
所有属性不需要在单独的行上,例如:
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)
)
此批处理代码可用于此任务:
@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
带有选项/F
的外部FOR解析由双引号中指定的环境变量ParameterFile
定义的文本文件,要求使用选项usebackq
逐行解释为文本文件的名称,始终忽略空行FOR默认情况下忽略以分号开头的行,因为eol=;
是行尾选项的默认值FOR默认情况下还使用普通空格和水平制表符将当前行拆分为子字符串,并仅将第一个空格/制表符分隔字符串分配给指定的循环变量。
这里不需要行拆分行为和忽略以分号开头的行。由于这个原因,delims=
定义了一个禁用行拆分行为的分隔符的空列表,而eol=
没有定义导致只忽略空行的行尾字符。在这种情况下,不能在双引号参数字符串中指定选项。因此,必须在参数字符串中指定这三个选项,在该参数字符串上,所有空格和等号都必须用插入字符^
转义,才能被解释为文字字符,而不是参数字符串分隔符。
FOR将不在双引号字符串内的水平制表符、正常空格、无中断空格(OEM代码页代码值为255十进制(、等号、逗号和分号解释为不使用选项/F
时要在循环中处理的一组字符串的分隔符。因此,对于给定的示例,可以使用一个for循环来解析文件中的一行。
请阅读Windows命令解释器(CMD.EXE(如何解析脚本?在命令块中定义/修改的环境变量不能在使用语法%variable%
的同一命令块中引用,因为在解析以(
开始并以匹配的)
结束的整个命令块时,cmd.exe
将所有%variable%
替换为variable
的当前值,这意味着在执行外部FOR命令之前。解决方法是使用延迟环境变量扩展或使用子例程,或使用命令CALL和语法%%variable%%
。
在执行外部FOR之前,行 FOR请注意,像用户名字符串这样的值包含被内部FOR解释为分隔符的字符,需要将该字符串值包含在 内部FOR循环中定义的环境变量可用于ENDLOCAL命令,该命令在执行此批处理文件之前恢复环境(环境变量、当前目录、命令扩展名状态和延迟扩展状态(。 为了理解所使用的命令及其工作方式,请打开命令提示符窗口,在那里执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面。call set "%%Variable%%=%%B"
被解析为call set "%Variable%=%B"
。由于命令CALL在执行命令SET之前将%Variable%
替换为环境变量Variable
的当前值,因此在执行内部FOR期间第二次解析此行。因此,在内部FOR循环的每个偶数迭代中分配给循环变量B
的值被分配给内部"
中,否则此批处理文件解决方案会产生错误的结果。call /?
echo /?
endlocal /?
for /?
goto /?
if /?
rem /?
set /?
setlocal /?