从批中读取字符分隔的属性文件



我有一个用分隔的属性文件;需要使用批处理脚本读取,并且属性将被设置为环境变量。

所有属性不需要在单独的行上,例如:

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之前,行call set "%%Variable%%=%%B"被解析为call set "%Variable%=%B"。由于命令CALL在执行命令SET之前将%Variable%替换为环境变量Variable的当前值,因此在执行内部FOR期间第二次解析此行。因此,在内部FOR循环的每个偶数迭代中分配给循环变量B的值被分配给内部

FOR请注意,像用户名字符串这样的值包含被内部FOR解释为分隔符的字符,需要将该字符串值包含在"中,否则此批处理文件解决方案会产生错误的结果。

内部FOR循环中定义的环境变量可用于ENDLOCAL命令,该命令在执行此批处理文件之前恢复环境(环境变量、当前目录、命令扩展名状态和延迟扩展状态(。

为了理解所使用的命令及其工作方式,请打开命令提示符窗口,在那里执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面。

  • call /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?

最新更新