我有两个我要从java程序调用的文件:
为了运行exe,我需要设置一些环境变量,这是使用批处理文件进行的。
set MSDEV_HOME=C:\Program Files\Microsoft Visual Studio 8\VC
set FOO_ROOT=D:\UGS\Support_Dev\2005SR1
set FOO_DATA=X:
call %FOO_DATA%\FOO_profilevars
set FOO_BIN=B:
set FOO_LIB=L:
set FOO_INCLUDE=I:
上述批处理文件中的 FOO_profilevars
是另一个批处理文件(这也只是设置环境),它存在于不同的硬盘上。
一旦设置了环境,我将调用exe。
由于某些原因,我要单独做这件事 - 我不能在另一个批处理文件或其他东西中将这两个联系起来并完成任务。
我尝试执行:
ProcessBuilder pb = new ProcessBuilder("D:\\newlogin\\setup.bat");
Process p = pb.start();
int exitValue = p.waitFor();
Map<String, String> env = pb.environment();
System.out.println("exitStatus > " + exitValue);
ProcessBuilder pb2 = new ProcessBuilder("d:\\newlogin\\tcelogin.exe",
"Eid123", "Eid123");
Process p2 = pb2.start();
int exitValue2 = p2.waitFor();
Map<String, String> env2 = pb2.environment();
System.out.println("exitStatus > " + exitValue2);
这不起作用 - 可能是因为在执行第二个进程时未使用第一个进程中设置的环境。 有没有办法在设置运行时的环境中执行文件。
更新 为什么单独表示: 我需要设置一些70env。因此,首选批处理文件。 2. EXE文件将返回需要处理的数据。
...
System.out.println("Process completed");
BufferedReader reader = null;
int exitValue = p.exitValue();
//System.out.println("Exit Value" + exitValue);
if(exitValue == 0)
{
reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
}
else
{
reader = new BufferedReader(new InputStreamReader(p.getErrorStream()));
}
StringBuffer sb = new StringBuffer();
String temp = reader.readLine();
while(temp != null)
{
sb.append(temp);
temp = reader.readLine();
}
reader.close();
System.out.println( sb.toString());
答案 0 :(得分:3)
请记住,批处理文件在cmd.exe
的新实例(Windows命令解释程序)中运行。无论你在环境中设置什么,都会留在那个过程中。你开始的下一个过程将不会看到任何这些变化,因为它们的制作过程已经很久了。
您可能希望在批处理文件的末尾运行程序,以确保它获得正确的环境。
或者您可以只改变Java应用程序中的环境,然后生成该进程。环境从调用进程继承,因此您启动的程序将继承您在Java中预先设置的环境。
ETA:这来自于从未使用过Java来生成进程的人。这就是流程及其环境在Windows中的工作方式。如果重新使用ProcessBuilder
效果更好,那就使用它。虽然我仍然认为从Java中设置环境比使用批处理文件用于相同目的更“干净”。
答案 1 :(得分:0)
你能不能重复使用第一个ProcessBuilder
?
ProcessBuilder pb = new ProcessBuilder("D:\\newlogin\\setup.bat");
....
pb.command("d:\\newlogin\\tcelogin.exe", "Eid123", "Eid123");
pb.start();
int exitValue2 = p.waitFor();
Map<String, String> env2 = pb.environment();
System.out.println("exitStatus > " + exitValue2);
或手动附加第一个环境中尚未包含在第二个环境中的所有值
ProcessBuilder pb = new ProcessBuilder("D:\\newlogin\\setup.bat");
...
Map<String, String> env = pb.environment();
...
ProcessBuilder pb2 = new ProcessBuilder("d:\\newlogin\\tcelogin.exe",
"Eid123", "Eid123");
Map<String, String> env2 = pb2.environment();
[PSEUDOCODE]
loop: for key,value in env
check if key exists in env2
if not: add (key,value) to env2
else: check if values different and add
[/PSEUDOCODE]
pb2.start();
....