我面临一个问题,我需要从 java 程序运行一个 bat 文件。此批处理文件包含某些 SET ms-dos 命令,我需要在我的应用程序中进一步访问。
我使用 ProcessBuilder 类来调用批处理文件,但 processBuilder.environment() 没有返回批处理文件设置的变量。
DOS SET 命令仅在该提示下设置变量。
我无法找到此问题的解决方案。
有没有针对此类问题的其他方法。我无法更改批处理文件。
问候阿拜
我面临一个问题,我需要从 java 程序运行一个 bat 文件。此批处理文件包含某些 SET ms-dos 命令,我需要在我的应用程序中进一步访问。
我使用 ProcessBuilder 类来调用批处理文件,但 processBuilder.environment() 没有返回批处理文件设置的变量。
DOS SET 命令仅在该提示下设置变量。
我无法找到此问题的解决方案。
有没有针对此类问题的其他方法。我无法更改批处理文件。
问候阿拜
您的 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 值。
另一种方法是将 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
System.getenv让你获得一个环境变量。它也应该在这种情况下工作。还有另一个版本返回Map
环境变量。