如何从批处理文件中读取属性文件

时间:2015-05-22 11:32:12

标签: batch-file properties-file

我有一个很长的test.properties文件,其中包含以下内容:

property1=cheese
property2=apple
property3=bread

# many more properties

我可以通过将工作目录更改为包含test.properties的工作目录并运行以下命令,从命令行中读取这些属性:

> FOR /F "tokens=1,2 delims==" %A IN (test.properties) DO
    IF "%A"=="property1" SET firstitem=%B
> FOR /F "tokens=1,2 delims==" %A IN (test.properties) DO
    IF "%A"=="property2" SET seconditem=%B

> echo %firstitem%
cheese
> echo %seconditem%
apple

但是,当我尝试将此代码放在存储在同一目录中的批处理文件中时,它会失败,我无法解决原因:

FOR /F "tokens=1,2 delims==" %A IN ("%~dp0\test.properties") DO 
    (IF "%A"=="property1" SET firstitem=%B)
FOR /F "tokens=1,2 delims==" %A IN ("%~dp0\test.properties") DO
    (IF "%A"=="property2" SET seconditem=%B)

从命令行运行批处理文件给我这个:

> "C:\folder\testbatch.bat"
~dp0\test.properties") DO IF "B was unexpected at this time.

如何使用批处理文件读取属性,以便将它们存储在可以在脚本其余部分中使用的变量中?

编辑:问题解决了;下面的工作代码。

FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%~dp0\test.properties") DO 
    (IF "%%A"=="property1" SET firstitem=%%B)
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%~dp0\test.properties") DO
    (IF "%%A"=="property2" SET seconditem=%%B)

2 个答案:

答案 0 :(得分:1)

这里有两个问题:

  1. 在批处理文件版本中,迭代器变量需要两个百分号。
  2. 在批处理文件版本中,您错误地在文件名周围加上引号,导致字符串本身被标记化,而不是字符串指定的文件内容。 更新: @Stephan正确地注意到使用usebackq修饰符来获得更通用的解决方案。但是,由于您正在谈论存储在同一目录中的批处理文件",您可以完全删除路径前缀%~dp0
  3. 更正版本:

    @ECHO OFF
    FOR /F "tokens=1,2 delims==" %%A IN (test.properties) DO (
        IF "%%A"=="property1" SET firstitem=%%B 
    )
    FOR /F "tokens=1,2 delims==" %%A IN (test.properties) DO (
        IF "%%A"=="property2" SET seconditem=%%B
    )
    ECHO %firstitem%
    ECHO %seconditem%
    

    返回:

    cheese
    apple
    

答案 1 :(得分:1)

  

"如何使用批处理文件读取属性,以便这样做   它们存储在可以在其余部分中使用的变量中   ?脚本"

如果您愿意使用文件中的字符串,那么这在您的案例中非常简单:

FOR /F "usebackq tokens=*" %%A IN ("%~dp0\test.properties") DO set %%A
echo property2 is %property2%

注意:如果您的路径或文件名包含空格,则需要引号。告诉for不要将其视为包含usebackq

的字符串