在Java中启动“cmd.exe”并写入其标准输入

问题描述 投票:0回答:1

有几个与此类似的问题(例如这里这里),但答案不起作用。

这是我的程序:

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
进程,以便立即创建控制台窗口(无需“启动”命令),以便我可以向其发送文本并将其显示在窗口中(就好像它来自控制台的标准输入)?

java windows process
1个回答
0
投票

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”,否则它不会退出 “还有。

© www.soinside.com 2019 - 2024. All rights reserved.