2012-07-03 100 views
1

我遇到了一個需要從java程序運行bat文件的問題。 這個批處理文件包含某些SET ms-dos命令,我需要在我的應用程序中進一步訪問。設置在java程序中通過批處理文件獲取環境變量

我用ProcessBuilder類來調用批處理文件,但processBuilder.environment()沒有返回我由批處理文件設置的變量。

DOS SET命令只在該提示符上設置變量。

我無法找到解決此問題的解決方案。

這種問題是否存在任何破解方法?我不能改變批處理文件。

問候 阿沛

+0

你能張貼批號?那裏可能有問題? –

回答

0

System.getenv讓你得到一個環境變量。它也應該在這方面工作。有another version它返回環境變量Map

+0

我試過System.getenv,但它只返回了我在mycom-> properties->環境變量中設置的那些屬性。 – user1499150

+0

它沒有返回我在批處理文件中設置的屬性。通過Ms-Dos SET命令 – user1499150

+0

這是我的功能 public static void main(String [] args){ \t \t String path =「D:\\ build \\ XL_7_12 \\ XL_7_12 \\ build \\ xl_env。CMD「; \t \t的ProcessBuilder的ProcessBuilder =新的ProcessBuilder(路徑); \t \t工藝過程= NULL; \t \t嘗試{ \t \t \t過程= processBuilder.start(); \t \t}趕上(例外五){ \t \t \t e.printStackTrace(); \t \t} \t \t地圖<字符串,字符串> ENV = System.getenv(); \t \t for(String envName:env.keySet()){ \t \t \t System.out.format(「%s =%s%n」,envName,env.get(envName)); \t \t} \t} – user1499150

0

ProcessBuilder實例包含子進程使用的環境變量。您應該引用processBuilder.environment(),而不是引用System.getenv()中發現的父進程的環境變量。

但是,您可能會發現它仍然是單向街道。您可以在那裏設置環境變量以傳遞給進程shell,但SET命令所做的更改將無法在返回時保留下來。

所以,這裏有一個替代方法。將批處理文件編寫爲包裝腳本,並將所需的變量輸出到更容易訪問的地方,如stdout,stderr或文件。

wrapper.bat 
=========== 
@echo off 
call "D:\build\XL_7_12\XL_7_12\build\xl_env.cmd" 
echo ROOT=%ROOT%,FOLDER=%FOLDER% 

然後你打電話給你wrapper.bat從Java和您的process.getInputStream()的最後一行收集和分析根和文件夾的值。

+0

感謝您的答覆。我想我必須按照上面建議的方式進行。從process.getInputStram獲取詳細信息 – user1499150

0

另一種方法是將ECHO命令的輸出重定向到一個文件,然後從Java中讀取它。例如。

echo ROOT=%ROOT%,FOLDER=%FOLDER% > \temp\vars.txt 

然後從java讀取\ temp \ vars.txt。這可能比讀取輸入流容易一些。最後,要知道,而不是wrapper.bat文件,你可以發出兩個命令到COMMAND.EXE interperter的一個副本,,這樣就共享的環境,所以你可以:

D:\build\XL_7_12\XL_7_12\build\xl_env.cmd & ECHO %ROOT% > \temp\vars.txt 
相關問題