2008-10-24 121 views
8

我正在嘗試讀取批處理文件中的變量,以便以後在批處理腳本中使用,這是一個Java啓動程序。理想情況下,我希望所有平臺(Unix,Windows)上的設置文件具有相同的格式,並且也是有效的Java屬性文件。也就是說,它應該是這樣的:從Windows批處理文件讀取環境變量(cmd.exe)

setting1=Value1 
setting2=Value2 
... 

是否有可能在Unix shell腳本來讀取這些值,就像您?該會應該是這個樣子:

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

我知道這可能是可能的SET setting1=Value1,但我真的寧願所有平臺上的設置相同的文件格式。

澄清:我需要在命令行/批處理環境中執行此操作,因爲我還需要設置JVM內不能更改的參數,例如-Xmx或-classpath。

回答

15

您可以在一個批處理文件如下做到這一點:

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

這讀取包含像「SETTING1 =值」字符串和調用SET將它們設置爲環境變量的文本文件。

setlocal/endlocal用於限制環境變量的範圍,以執行批處理文件。

CMD命令處理器實際上是相當強大的,雖然有一個相當的拜占庭語法。

2

您可以將屬性文件作爲參數傳遞給Java程序(稍後可能啓動主程序)。然後受益於多平臺範例。

+0

是的,這就是G ^通常是真的,但我需要配置像-Xmx這樣的東西,當JVM運行時這當然不能改變。 – 2008-11-07 13:27:35

+0

噢,我明白了,這與解決方案相比聽起來有點矯枉過正,但您可能會從另一個Java中重新啓動Java。不要誤會我喜歡選擇的解決方案。 – 2008-11-24 23:32:18

0

您也可以在Java程序中訪問OS」環境變量:

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)); 
     } 
    } 
} 
1

這可能是明智的,只有進口特定變量從一個屬性文件(你知道時間提前的),在這種情況下,我建議的功能如下所示:

: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被調用來設置變量設置1和設置2

相關問題