我有一个要求,我想从.properties文件中读取值
我的属性文件test.properties
内容
file=jaguar8
extension=txt
path=c:\Program Files\AC
从上面的文件中我需要提取jaguar
或=
请帮帮我。感谢
答案 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
- 循环使用eol
和delims
选项以及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