Read environment variables from file in Windows Batch (cmd.exe)

24,946

Solution 1

You can do this in a batch file as follows:

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

This reads a text file containing strings like "SETTING1=VALUE1" and calls SET to set them as environment variables.

setlocal/endlocal are used to limit the scope of the environment variables to the execution of your batch file.

The CMD Command Processor is actually quite powerful, though with a rather byzantine syntax.

Solution 2

You can pass the property file as a parameter to a Java program (that may launch the main program later on). And then benefit from the multi platform paradigm.

Solution 3

It may be wise to only import specific variables from a properties file (ones you know about ahead of time), in that case I recommend a function like the following:

: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

Which would be called by call:parsePropertiesFile props.properties setting1 setting2 to set the variables setting1 and setting2

Share:
24,946
Martin Probst
Author by

Martin Probst

Updated on December 24, 2021

Comments

  • Martin Probst
    Martin Probst over 2 years

    I'm trying to read variables from a batch file for later use in the batch script, which is a Java launcher. I'd ideally like to have the same format for the settings file on all platforms (Unix, Windows), and also be a valid Java Properties file. That is, it should look like this:

    setting1=Value1
    setting2=Value2
    ...
    

    Is it possible to read such values like you would in a Unix shell script? The could should look something like this:

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

    I know that this is probably possible with SET setting1=Value1, but I'd really rather have the same file format for the settings on all platforms.

    To clarify: I need to do this in the command line/batch environment as I also need to set parameters that cannot be altered from within the JVM, like -Xmx or -classpath.

  • Paolo Di Pietro
    Paolo Di Pietro over 15 years
    Oh I see, it's sounds overkill compare to the solutions but you may re-launch the Java from another Java. Don't get my wrong I do prefer the selected solution.
  • Pereira
    Pereira over 8 years
    After a long time looking for a solution, I found this solution. Thank you!
  • malthe
    malthe over 4 years
    How would you ignore a "comment" (for example, a line starting with a "#" character) - ?
  • Joe
    Joe about 3 years
    @malthe - one way is just to ignore any error messages the comment lines produce, or hide them thus FOR /F "tokens=*" %%i in ('type Settings.txt') do SET %%i 2> NUL:
  • shurkam
    shurkam almost 3 years
    @malthe - Add eol=<comment character>. FOR /F "tokens=* eol=#" %%i in ('type Settings.txt') do SET %%i
  • Stephan
    Stephan over 2 years
    No need for /a, as batch knows about only one variable type anyway: STRING. set /a is used to translate strings into integers to do arithmetic and assigns again a string to the variable.