Решение с поддержкой комментариев (стиль #). См. Комментарии в коде для объяснения.
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
-петле с переменной и ее значением, безусловно, зависит от вас - присвоение некоторым префиксным переменным было лишь примером. Подход с использованием пространства имен позволяет избежать переопределения любой другой глобальной переменной.
Например, если у вас есть что-то вроде appdata
, определенное в вашем файле .properties.
Я использую это, чтобы избавиться от дополнительного config.bat, и вместо этого использую один файл .properties для java-приложения и некоторых вспомогательных командных файлов.
У меня работает, но, конечно, здесь не все крайние случаи описаны, поэтому улучшения приветствуются!