Как читать из файла .properties, используя пакетный скрипт - PullRequest
12 голосов
/ 10 октября 2011

У меня есть требование, где я хотел бы прочитать значения из файла .properties

мой файл свойств test.properties content

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

Из вышеуказанного файла мне нужно получитьjaguar или что-нибудь после =

Пожалуйста, помогите мне.Спасибо

Ответы [ 6 ]

22 голосов
/ 10 октября 2011
For /F "tokens=1* delims==" %%A IN (test.properties) DO (
    IF "%%A"=="file" set file=%%B
)

echo "%file%"

надеюсь, что это может помочь

17 голосов
/ 22 февраля 2013
@echo off  
FOR /F "tokens=1,2 delims==" %%G IN (test.properties) DO (set %%G=%%H)  
echo %file%  
echo %extension%  
echo %path%

Обратите внимание, что после %% H нет пробела. Иначе это приводит к добавлению пробела, например, к путям к файлам, и к ошибкам файла не найден, когда переменные из файлов свойств используются как часть пути к файлу.

6 голосов
/ 25 ноября 2015

Решение с поддержкой комментариев (стиль #). См. Комментарии в коде для объяснения.

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-приложения и некоторых вспомогательных командных файлов.

У меня работает, но, конечно, здесь не все крайние случаи описаны, поэтому улучшения приветствуются!

6 голосов
/ 10 октября 2011

Попробуйте это

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
0 голосов
/ 23 марта 2018

Вы можете попробовать это:

@ECHO OFF
@SETLOCAL
FOR /F "tokens=1* delims==" %%A IN (test.properties) DO (
ECHO %%A   =    %%B 
)
@ENDLOCAL
0 голосов
/ 05 июня 2017

Я знаю, что это древний пост, но я хотел бы остановиться на великолепном ответе Тощуга.

Если путь в файле .properties будет определен как% ~ dp0 или любая другая переменная, которую необходимо сначала развернуть перед использованием, я рекомендую сделать это следующим образом:

В файле .properties:

path=%~dp0

В пакетном файле вы можете использовать его следующим образом (код должен использоваться между двумя для определения одного <=> одного из них):

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...