在远程服务器上以Java运行批处理文件

时间:2013-02-16 23:46:43

标签: java batch-file processbuilder psexec

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

我可以使用流程构建器启动该文件,它适用于大多数命令,但似乎挂断了。

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

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.退出

然后它挂起

显然没有读取设定行,但更重要的是我还没有弄清楚如何将输入传递回子流程。

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);
    }

任何意见都会受到赞赏。

2 个答案:

答案 0 :(得分:0)

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

PrintWriter writer = new PrintWriter(process.getOutputStream());
writer.println("10");
writer.flush();

答案 1 :(得分:0)

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

当您通过Process.getInputStream()阅读流程输出时,您可以使用Process.getOutputStream()向其发送输入。

  

public abstract OutputStream getOutputStream()

     

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

     

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