【问题标题】:How to read properties file from batch file如何从批处理文件中读取属性文件
【发布时间】:2015-05-22 11:32:11
【问题描述】:

我有一个很长的 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)

【问题讨论】:

    标签: batch-file properties-file


    【解决方案1】:

    这里有两个问题:

    1. 在批处理文件版本中,迭代器变量需要 两个 百分号。
    2. 在批处理文件版本中,您错误地将文件名放在引号中,导致字符串本身被标记,而不是字符串指定的文件内容。 更新: @Stephan 正确地指出了使用 usebackq 修饰符以获得更通用的解决方案。但既然您说的是“批处理文件存储在同一目录中”,您不妨将路径前缀%~dp0 完全去掉。

    修正版:

    @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
    

    【讨论】:

    • 接受了这个答案,因为它几乎解决了我的问题。我仍然必须使用 usebackq 才能使其正常工作;由于某种原因,上面写的内容没有给我任何输出。
    • 为什么要一遍遍地阅读文件? (“#更多属性”)。将所有if 放入一个for-statement。
    • @Stephan:你说的没错,当然,但我想坚持 OP 给出的结构。
    • @Richard:你是在资源管理器中通过“以管理员身份运行”运行它吗?如果是这样,则当前目录将更改为%SystemRoot%\system32,并且test.properties 很可能不在其中。这就解释了为什么你需要%~dp0 位。请参阅 here 了解替代解决方案。
    • 只读取一次文件确实会更有效,而不是为每个要读取的属性读取一次。我只是无法让其工作的语法(可以合理地确定逻辑是正确的),而且这种方法仍然只需要几分之一秒。
    【解决方案2】:

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

    如果您愿意使用文件中的字符串,这对您来说非常容易:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 2016-08-07
      • 2014-05-29
      相关资源
      最近更新 更多