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

时间:2018-12-20 05:28:49

标签: batch-file

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

所有属性不必放在单独的行上,例如:

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 :(得分:0)

此批处理代码可用于此任务:

@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 循环从文件中解析一行。

请阅读How does the Windows Command Interpreter (CMD.EXE) parse scripts?由于%variable%会替换所有cmd.exe,因此无法使用语法%variable%在同一命令块中引用在命令块中定义/修改的环境变量。在解析整个命令块(从variable开始并以匹配的(结束时)的当前值)的基础上,这意味着在这种情况下,先执行外部 FOR 命令。解决方法是使用延迟的环境变量扩展,使用子例程或使用命令 CALL 和语法%%variable%%

在执行外部 FOR 之前,将行call set "%%Variable%%=%%B"解析为call set "%Variable%=%B"。在执行内部 FOR 期间,由于执行命令 CALL %Variable%用环境变量Variable的当前值替换了B,因此在执行内部 FOR 期间第二次分析了该行命令 SET 。因此,在内部 FOR 的每个偶数迭代中分配给循环变量Variable的值将分配给环境变量,其名称由内部 FOR的每个奇数迭代确定。 strong>循环并分配给名称为"的环境变量。

请注意,诸如用户名字符串之类的值包含由内部 FOR 解释为定界符的字符,要求该字符串值包含在call /?中,否则此批处理文件解决方案会产生一个错误的结果。

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

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

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rem /?
  • set /?
  • setlocal /?
  • {{1}}