如何使用批处理脚本从.properties文件中读取

时间:2011-10-10 04:56:05

标签: windows batch-file

我有一个要求,我想从.properties文件中读取值

我的属性文件test.properties内容

file=jaguar8
extension=txt
path=c:\Program Files\AC

从上面的文件中我需要提取jaguar=

之后的任何内容

请帮帮我。感谢

6 个答案:

答案 0 :(得分:21)

For /F "tokens=1* delims==" %%A IN (test.properties) DO (
    IF "%%A"=="file" set file=%%B
)

echo "%file%"
希望这可以帮助

答案 1 :(得分:17)

@echo off  
FOR /F "tokens=1,2 delims==" %%G IN (test.properties) DO (set %%G=%%H)  
echo %file%  
echo %extension%  
echo %path%

请注意%% H之后没有空格。否则,这会导致将空间附加到文件路径,例如,当属性文件中的变量用作文件路径的一部分时,将导致文件未找到错误。由于这个原因,数小时都会出现!

答案 2 :(得分:6)

试试这个

echo off
setlocal
FOR /F "tokens=3,* delims=.=" %%G IN (test.properties) DO ( set %%G=%%H )

rem now use below vars
if "%%G"=="file"
 set lfile=%%H
if "%%G"=="path"
 set lpath=%%H
if "%%G"=="extension"
 set lextention=%%H
echo %path%

endlocal

答案 3 :(得分:6)

支持评论的解决方案(#style)。请参阅代码中的注释以获得解释。

test.properties:

# some comment with = char, empty line below

#invalid.property=1
some.property=2
some.property=3
# not sure if this is supported by .properties syntax
text=asd=f

属性 - read.bat:

@echo off

rem eol stops comments from being parsed
rem otherwise split lines at the = char into two tokens
for /F "eol=# delims== tokens=1,*" %%a in (test.properties) do (

    rem proper lines have both a and b set
    rem if okay, assign property to some kind of namespace
    rem so some.property becomes test.some.property in batch-land
    if NOT "%%a"=="" if NOT "%%b"=="" set test.%%a=%%b
)

rem debug namespace test.
set test.

rem do something useful with your vars

rem cleanup namespace test.
rem nul redirection stops error output if no test. var is set
for /F "tokens=1 delims==" %%v in ('set test. 2^>nul') do (
    set %%v=
)

来自set test.的输出(见上文):

test.some.property=3
test.text=asd=f

最重要的部分是:

  • for - 循环使用eoldelims选项以及
  • if - 检查是否设置了变量%%a%%b

你在for - 循环中用变量及其值做什么肯定取决于你 - 分配一些前缀变量只是一个例子。命名空间方法避免了任何其他全局变量被覆盖。 例如,如果您在.properties文件中定义了appdata

我正在使用它来摆脱额外的config.bat,而是使用一个.properties文件同时支持java应用程序和一些支持批处理文件。

适合我,但肯定不是每个边缘案例都在这里,所以欢迎改进!

答案 4 :(得分:0)

我知道这是古老的帖子,但我想扩展toschug的好答案。

如果.properties文件中的路径定义为%~dp0或任何其他需要在使用之前先扩展的变量,我建议按以下方式进行:

在.properties文件中:

path=%~dp0

在批处理文件中,您可以按以下方式使用它(代码将在两者之间用于(s)定义一个< =>清理一个):

if "!test.path!" NEQ "" (
   echo Not expanded path: !test.path!
   call :expand !test.path! test.path
)

echo test.path expanded: !test.path!
pause

:expand
SET "%~2=%~1"
GOTO :EOF

不要忘记使用(在批处理文件的开头):

SETLOCAL ENABLEDELAYEDEXPANSION

答案 5 :(得分:0)

你可以试试这个:

@ECHO OFF
@SETLOCAL
FOR /F "tokens=1* delims==" %%A IN (test.properties) DO (
ECHO %%A   =    %%B 
)
@ENDLOCAL