通过java程序中的批处理文件设置\ Getting Environment Variables

时间:2012-07-03 14:55:29

标签: java

我遇到了一个需要从java程序运行bat文件的问题。 此批处理文件包含某些SET ms-dos命令,我需要在我的应用程序中进一步访问该命令。

我使用ProcessBuilder类来调用批处理文件,但是processBuilder.environment()没有返回批处理文件设置的变量。

DOS SET命令仅设置该提示符上的变量。

我无法找到解决此问题的方法。

这种问题是否存在任何溃疡方法?我无法更改批处理文件。

此致 艾比

3 个答案:

答案 0 :(得分:0)

System.getenv可让您获得环境变量。它也应该在这种情况下起作用。有another version返回Map个环境变量。

答案 1 :(得分: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%

然后从Java调用wrapper.bat并从process.getInputStream()的最后一行收集并解析ROOT和FOLDER值。

答案 2 :(得分: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