0

我正在尝试使用 Java 与使用 psexec 在远程服务器上执行命令的大型批处理文件进行交互。

我可以使用 process builder 启动文件,它适用于大多数命令,但似乎挂断了。

批处理文件中的一个特定命令如下:

ECHO .
Echo Which would you like to reboot?
Echo 1-10. For computers, enter computer number.
Echo E. Exit
set /p userinp=choose a number(0-22):

但从Java我得到:。您要重新启动哪个?1-10。对于计算机,输入计算机编号。E. 退出

然后它挂起

它显然不是在读取 set 行,但更重要的是我还没有弄清楚如何将输入传递回子进程。

String[] command = {"cmd", "/c", "batchfile", "restart"};
ProcessBuilder builder = new ProcessBuilder(command);
builder.directory(new File("C:\\"));
    Process process = builder.start();

InputStream is = process.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);

    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }

任何输入将不胜感激。

4

2 回答 2

0

您的批处理作业需要您实际提供输入才能继续,这就是它看起来“挂起”的原因。您需要通过其输出流将此输入提供给流程。一个高度简化的例子:

PrintWriter writer = new PrintWriter(process.getOutputStream());
writer.println("10");
writer.flush();
于 2013-02-16T23:53:37.337 回答
0

您的进程不会挂起,它只是等待命令行中的一些输入,然后再继续。

当您通过 读取进程的输出时Process.getInputStream(),您可以使用 将输入发回给它Process.getOutputStream()

公共抽象输出流 getOutputStream()

获取子流程的输出流。流的输出通过管道传输到此 Process 对象表示的进程的标准输入流中。实施说明:缓冲输出流是个好主意。

返回:连接到子进程正常输入的输出流。

于 2013-02-16T23:54:54.617 回答