Чтение переменных среды из файла в пакетной программе Windows (cmd.exe)

Я пытаюсь прочитать переменные из пакетного файла для последующего использования в пакетном сценарии, который является средством запуска Java. В идеале я хотел бы иметь одинаковый формат файла настроек на всех платформах (Unix, Windows), а также быть действительным файлом свойств Java. То есть это должно выглядеть так:

setting1=Value1
setting2=Value2
...

Можно ли читать такие значения, как в сценарии оболочки Unix? Мог бы выглядеть примерно так:

READ settingsfile.xy
java -Dsetting1=%setting1% ...

Я знаю, что это, вероятно, возможно с SET setting1=Value1, но я бы предпочел иметь один и тот же формат файла для настроек на всех платформах.

Чтобы уточнить: мне нужно сделать это в командной строке/пакетной среде, так как мне также нужно установить параметры, которые нельзя изменить из JVM, например -Xmx или -classpath.


person Martin Probst    schedule 24.10.2008    source источник


Ответы (4)


Вы можете сделать это в пакетном файле следующим образом:

setlocal
FOR /F "tokens=*" %%i in ('type Settings.txt') do SET %%i
java -Dsetting1=%setting1% ...
endlocal

Это читает текстовый файл, содержащий такие строки, как «SETTING1 = VALUE1», и вызывает SET, чтобы установить их как переменные среды.

setlocal/endlocal используются для ограничения области переменных среды выполнением вашего командного файла.

Командный процессор CMD на самом деле довольно мощный, хотя и с довольно замысловатым синтаксисом.

person Joe    schedule 24.10.2008
comment
После долгих поисков решения я нашел это решение. Благодарю вас! - person Pereira; 26.01.2016
comment
Как бы вы проигнорировали комментарий (например, строку, начинающуюся с символа #) - ? - person malthe; 02.12.2019
comment
@malthe - один из способов - просто игнорировать любые сообщения об ошибках, которые выдают строки комментариев, или скрывать их таким образом FOR /F "tokens=*" %%i in ('type Settings.txt') do SET %%i 2> NUL: - person Joe; 20.02.2021
comment
@malthe — добавьте eol=‹символ комментария›. FOR /F "tokens=* eol=#" %%i in ('type Settings.txt') do SET %%i - person shurkam; 01.06.2021

Вы можете передать файл свойств в качестве параметра программе Java (которая может запустить основную программу позже). А затем извлеките выгоду из многоплатформенной парадигмы.

person call me Steve    schedule 24.10.2008
comment
Да, в целом это так, но мне нужно настроить такие вещи, как -Xmx, которые, конечно, нельзя изменить после запуска JVM. - person Martin Probst; 07.11.2008
comment
О, я вижу, это звучит излишне по сравнению с решениями, но вы можете перезапустить Java с другой Java. Не поймите меня неправильно, я предпочитаю выбранное решение. - person call me Steve; 25.11.2008

Может быть целесообразно импортировать только определенные переменные из файла свойств (те, о которых вы знаете заранее), в этом случае я рекомендую следующую функцию:

:parsePropertiesFile
    set PROPS_FILE=%1
    shift
    :propLoop
    if "%1"=="" goto:eof
    FOR /F "tokens=*" %%i in ('type %PROPS_FILE% ^| findStr.exe "%1="') do SET %%i
    shift
    GOTO propLoop
goto:eof

Который будет вызываться call:parsePropertiesFile props.properties setting1 setting2 для установки переменных settings1 и setting2

person Jared    schedule 01.06.2011

Вы также можете получить доступ к переменным среды ОС из программы Java:

import java.util.Map;

public class EnvMap {
    public static void main (String[] args) {
        Map<String, String> env = System.getenv();
        for (String envName : env.keySet()) {
            System.out.format("%s=%s%n", envName, env.get(envName));
        }
    }
}
person micro    schedule 24.10.2008