Batch file 如何从批处理文件中读取属性文件
我有一个很长的test.properties文件,它在最顶端包含以下内容: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"
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)
这里有两个问题:
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
位。请参阅,以获得替代解决方案。只读取一次文件确实比只读取一次要读取的每个属性更有效。我只是无法让语法工作(合理地确定逻辑是正确的),而这个方法仍然只需要几分之一秒。