Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何从批处理文件中读取属性文件_Batch File_Properties File - Fatal编程技术网

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

Batch file 如何从批处理文件中读取属性文件,batch-file,properties-file,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"

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

这里有两个问题:

  • 在批处理文件版本中,迭代器变量需要两个百分比符号
  • 在批处理文件版本中,错误地在文件名周围加引号,导致字符串本身被标记化,而不是字符串指定的文件内容更新:@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
    
    “如何使用批处理文件读取属性,以便 它们存储在变量中,这些变量可以在系统的其余部分中使用 剧本?”

    如果您愿意使用文件中的字符串,那么在您的情况下这是非常容易的:

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

    注意:如果路径或文件名包含空格,则需要引号。告诉
    for
    不要用
    usebackq

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