我遇到了一个需要从java程序运行bat文件的问题。 此批处理文件包含某些SET ms-dos命令,我需要在我的应用程序中进一步访问该命令。
我使用ProcessBuilder类来调用批处理文件,但是processBuilder.environment()没有返回批处理文件设置的变量。
DOS SET命令仅设置该提示符上的变量。
我无法找到解决此问题的方法。
这种问题是否存在任何溃疡方法?我无法更改批处理文件。
此致 艾比
答案 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