从java运行.exe并继续
如果.exe程序尚未运行,我希望以编程方式运行该程序。 目前,我使用process builder从java启动.bat。批处理文件在检查.exe是否正在运行后运行。 问题是,在用户关闭.exe程序之前,java不会继续运行。我怎样才能解决这个问题 Java代码:从java运行.exe并继续,java,batch-file,processbuilder,Java,Batch File,Processbuilder,如果.exe程序尚未运行,我希望以编程方式运行该程序。 目前,我使用process builder从java启动.bat。批处理文件在检查.exe是否正在运行后运行。 问题是,在用户关闭.exe程序之前,java不会继续运行。我怎样才能解决这个问题 Java代码: try { ProcessBuilder builder = new ProcessBuilder("open.bat"); final Process process = builder.start(
try {
ProcessBuilder builder = new ProcessBuilder("open.bat");
final Process process = builder.start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
while ((br.readLine()) != null) {
}
System.out.println("command line terminated");
} catch (Exception err) {
err.printStackTrace();
System.out.println("error ");
}
批次代码:(open.bat)
已更新 使用
start "" "C:\Program Files (x86)\Adobe\Adobe Illustrator CS4\Support Files\Contents\Windows\illustrator.exe"
作为open.bat
批处理文件并使用
try {
ProcessBuilder builder = new ProcessBuilder("open.bat");
builder.redirectError();
builder.inheritIO();
final Process process = builder.start();
final InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String text = null;
while ((text = br.readLine()) != null) {
System.out.println(text);
}
System.out.println("command line terminated");
System.out.println("Exited with " + process.waitFor());
} catch (Exception err) {
err.printStackTrace();
System.out.println("error ");
}
我可以让批处理文件运行和终止,仍然有Illustrator加载和运行
主要的新增功能是调用ProcessBuilder#Inheritaio
,这有一些我不知道的魔力,但似乎允许批处理文件终止
从
这提供了与大多数操作系统命令解释器或标准C库函数system()相当的行为
创建一个新线程?将
同时((br.readLine())!=null){
移动到另一个线程,让它安静地使用结果,这将允许其余的代码,记住,IO可能会阻塞,循环也会阻塞;)您是否得到“命令行终止”输出??释放你的进程这很奇怪;start
应该立即返回。当你打印从程序中读取的行时,它会说什么吗?@MadProgrammer这在这里是不必要的,对吧?因为start
应该启动illustrator.exe
分离,理论上批处理文件不应该在某个时间等待对于它运行到终点的程序,@Audrey Yea,这是一个有趣的过山车旅程,“我不知道为什么会这样,但它会这样,所以不要想太久,否则它可能会停止”…在办公室里,和;)来自API的:pb.inheritIO()的行为与调用pb.redirectInput(Redirect.INHERIT)的行为完全相同.redirectOutput(Redirect.INHERIT).redirectError(Redirect.INHERIT)很吸引人。有机会的话,我想更深入地研究一下。start
设置标准流的方式一定有些奇怪。让它工作起来很好。@Audrey只是出于好奇,如果你有机会,如果你将批处理文件中的命令更改为cmd/C start…
,你的原始版本能工作吗?@JasonC我大约90%确定这对我不起作用,但我做了太多奇怪的事情,我可能错了。。。
try {
ProcessBuilder builder = new ProcessBuilder("open.bat");
builder.redirectError();
builder.inheritIO();
final Process process = builder.start();
final InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String text = null;
while ((text = br.readLine()) != null) {
System.out.println(text);
}
System.out.println("command line terminated");
System.out.println("Exited with " + process.waitFor());
} catch (Exception err) {
err.printStackTrace();
System.out.println("error ");
}