Umgebungsvariablen aus Datei in Windows Batch lesen (cmd.exe)
-
04-07-2019 - |
Frage
Ich versuche, Variablen aus einer Batch-Datei zur späteren Verwendung im Batch-Skript zu lesen, bei dem es sich um einen Java-Launcher handelt.Ich möchte idealerweise auf allen Plattformen (Unix, Windows) das gleiche Format für die Einstellungsdatei haben und außerdem eine gültige Java-Eigenschaftendatei sein.Das heißt, es sollte so aussehen:
setting1=Value1
setting2=Value2
...
Ist es möglich, solche Werte wie in einem Unix-Shell-Skript zu lesen?Das könnte etwa so aussehen:
READ settingsfile.xy
java -Dsetting1=%setting1% ...
Ich weiß, dass dies wahrscheinlich mit möglich ist SET setting1=Value1
, aber ich hätte lieber das gleiche Dateiformat für die Einstellungen auf allen Plattformen.
Um klarzustellen:Ich muss dies in der Befehlszeilen-/Batch-Umgebung tun, da ich auch Parameter festlegen muss, die nicht innerhalb der JVM geändert werden können, wie z. B. -Xmx oder -classpath.
Lösung
Sie können dies in einer Batch-Datei wie folgt tun:
setlocal
FOR /F "tokens=*" %%i in ('type Settings.txt') do SET %%i
java -Dsetting1=%setting1% ...
endlocal
Dies liest eine Textdatei mit Zeichenfolgen wie „SETTING1=VALUE1“ und ruft SET auf, um sie als Umgebungsvariablen festzulegen.
setlocal/endlocal werden verwendet, um den Umfang der Umgebungsvariablen auf die Ausführung Ihrer Batchdatei zu beschränken.
Der CMD-Befehlsprozessor ist tatsächlich ziemlich leistungsfähig, allerdings mit einer eher byzantinischen Syntax.
Andere Tipps
Sie können die Eigenschaftendatei als Parameter an ein Java-Programm übergeben (das später möglicherweise das Hauptprogramm startet).Und dann vom Multi-Plattform-Paradigma profitieren.
Es kann sinnvoll sein, nur bestimmte Variablen aus einer Eigenschaftendatei zu importieren (solche, die Sie im Voraus kennen). In diesem Fall empfehle ich eine Funktion wie die folgende:
: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
Welches würde aufgerufen werden von call:parsePropertiesFile props.properties setting1 setting2
um die Variablen Setting1 und Setting2 zu setzen
Sie können auch aus einem Java-Programm heraus auf die Umgebungsvariablen des Betriebssystems zugreifen:
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));
}
}
}