从java应用程序在当前cmd.exe中运行.bat

时间:2017-11-29 13:39:25

标签: java

我有一个简单的批处理文件:

test.bat的

@echo off
echo "Hello World!"

我想在同一个cmd.exe进程中运行一个运行该批处理文件的java应用程序。这方面的一个例子如下:

> java -jar my.jar
Hello World!

这是一个微不足道的案例,因为我打算使用的真实批处理文件需要用户在特定时间输入,因此我需要批处理文件正在运行,而不仅仅是打印类似示例显示。

我尝试了以下但没有成功:

Process p = Runtime.getRuntime().exec("./my.bat");
// and
ProcessBuilder pb = new ProcessBuilder("./my/bat");
Process p = pb.start();
p.waitfor();

这可行吗?我不想打开另一个cmd.exe,因此我的exec()参数不是:

'cmd /k start ./my.bat'

这会打开一个新窗口。

我的项目结构:

root
-- my.jar
-- src
---- ...
-- manifest.mf
-- my.bat

所以当我发出:

> my.bat
"Hello World!"

> java -jar my.jar
// nothing appears

1 个答案:

答案 0 :(得分:2)

在启动Java进程的cm​​d.exe进程中运行批处理文件实际上是不可能的。这是因为cmd.exe进程当前正在等待Java Process.waitFor()等待Java进程完成。

但也许您真正想要的不一定是在与Java应用程序的父进程相同的进程中运行批处理文件,而只是运行相同的窗口。为此,请使用ProcessBuilder.inheritIO()

ProcessBuilder pb = new ProcessBuilder("my.bat");
pb.inheritIO();
Process p = pb.start();
p.waitfor();

inheritIO()调用导致批处理文件的输出显示在Java进程的System.out中,而Java进程的System.in则链接到批处理文件的输入。