Чтение переменных среды из файла в Windows Batch (cmd.exe)
-
04-07-2019 - |
Вопрос
Я пытаюсь прочитать переменные из пакетного файла для последующего использования в пакетном скрипте, который является средством запуска Java. В идеале я хотел бы иметь одинаковый формат для файла настроек на всех платформах (Unix, Windows), а также быть действительным файлом свойств Java. То есть это должно выглядеть так:
setting1=Value1
setting2=Value2
...
Можно ли читать такие значения, как в сценарии оболочки Unix? Может выглядеть примерно так:
READ settingsfile.xy
java -Dsetting1=%setting1% ...
Я знаю, что это возможно при использовании SET setting1 = Value1
, но я бы предпочел использовать один и тот же формат файла для настроек на всех платформах.
Чтобы уточнить: мне нужно сделать это в командной строке / пакетной среде, так как мне также нужно установить параметры, которые нельзя изменить изнутри JVM, например -Xmx или -classpath.
Решение
Вы можете сделать это в командном файле следующим образом:
setlocal
FOR /F "tokens=*" %%i in ('type Settings.txt') do SET %%i
java -Dsetting1=%setting1% ...
endlocal
При этом читается текстовый файл, содержащий строки, подобные " SETTING1 = VALUE1 " и вызывает SET, чтобы установить их в качестве переменных среды.
setlocal / endlocal используются для ограничения области действия переменных среды выполнением вашего пакетного файла.
Командный процессор CMD на самом деле довольно мощный, хотя и с довольно византийским синтаксисом.
Другие советы
Вы можете передать файл свойств в качестве параметра программе Java (которая может запустить основную программу позже). А потом воспользоваться мультиплатформенной парадигмой.
Может быть целесообразно импортировать только определенные переменные из файла свойств (о которых вы знаете заранее), в этом случае я рекомендую функцию, подобную следующей:
: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
Который будет вызываться вызовом : parsePropertiesFile props.properties setting1 setting2
для установки переменных setting1 и setting2
Вы также можете получить доступ к переменным окружения ОС из 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));
}
}
}