这是我的程序:
ProcessBuilder pb = new ProcessBuilder("cmd", "/k");
Process p = pb.start();
Writer w = new PrintWriter(p.getOutputStream());
w.write("echo ABCD\n");
w.flush();
运行,但没有弹出控制台窗口。
如果我这样做:
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "start");
它会创建一个控制台窗口,但它不接受输入(“echo ABCD
") 因为新的控制台窗口实际上是我创建的 cmd
进程的子进程。
如何创建一个
cmd
进程,以便立即创建控制台窗口(无需“启动”命令),以便我可以向其发送文本并将其显示在窗口中(就好像它来自控制台的标准输入)?
cmd.exe 作为控制台使用的可执行文件是 conhost.exe,因此调整命令并将字节写入控制台:
start(new String[]{"conhost.exe"}, ("ABCD"+System.lineSeparator()).getBytes(), System.out);
开始定义为:
static int start(String[] cmd, byte[] stdin, OutputStream stdout) throws IOException, InterruptedException {
System.out.println("start "+Arrays.toString(cmd));
// Launch and wait:
ProcessBuilder pb = new ProcessBuilder(cmd);
pb.redirectErrorStream(true); // No STDERR => merge to STDOUT
Process p = pb.start();
// Send STDIN if required, and close STDIN stream
// NOTE!!! a huge input stream can lock up STDOUT/STDERR readers, you may need a background thread here
try(OutputStream os = p.getOutputStream()) {
if (stdin != null) os.write(stdin);
}
// Move STDOUT to the output stream
try(var stdo = p.getInputStream()) {
stdo.transferTo(stdout);
}
int rc = p.waitFor();
System.out.println("start "+Arrays.toString(cmd));
System.out.println("Exit "+p.pid()+" CODE "+rc +' '+(rc == 0 ? "OK":"**** ERROR ****"));
return rc;
}
请注意,上面将使用初始命令“ABCD”启动控制台,但除非您还发送“exit”,否则它不会退出 “还有。