我有一个简单的批处理文件:
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
答案 0 :(得分:2)
在启动Java进程的cmd.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则链接到批处理文件的输入。