1

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

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

DOS SET 命令仅在该提示下设置变量。

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

有没有针对此类问题的其他方法。我无法更改批处理文件。

问候阿拜

4

3 回答 3

0

您的 ProcessBuilder 实例包含子进程使用的环境变量。您应该引用processBuilder.environment()而不是引用 中找到的父进程的环境变量System.getenv()

但是,您可能会发现它仍然是一条单行道。您可以在那里设置环境变量以传递给您的进程外壳,但 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() 的最后一行收集和解析 ROOT 和 FOLDER 值。

于 2012-07-03T20:52:36.163 回答
0

另一种方法是将 ECHO 命令的输出重定向到一个文件,然后稍后从 Java 中读取它。例如。

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

然后从 java 中读取 \temp\vars.txt。这可能比读取输入流要容易一些。最后,请注意,您可以向 command.exe interperter 的单个副本发出两个命令,而不是 wrapper.bat 文件,从而共享环境,因此您可以:

D:\build\XL_7_12\XL_7_12\build\xl_env.cmd & ECHO %ROOT% > \temp\vars.txt
于 2012-07-06T15:11:35.177 回答
0

System.getenv让你获得一个环境变量。它也应该在这种情况下工作。还有另一个版本返回Map环境变量。

于 2012-07-03T14:58:06.953 回答