0

我有一个 exe 程序放在共享位置。开始时不需要任何参数。当它在命令窗口中启动时,它会显示一个帮助菜单,其中包含可以使用它执行的命令列表,并以>期望输入命令结束。我需要执行TRIGGER从该列表调用的一个特定命令。到目前为止,这就是我所拥有的,但它完全失败了。它既不显示进程的输出,也不trigger从流中获取输入命令。

public void execute(){

    String cmd = "\\\\sharedLocation\\server\\adm.exe";
    p = Runtime.getRuntime().exec(cmd);

    InputStream in = p.getInputStream();
    OutputStream out = p.getOutputStream();

    BufferedReader br= new BufferedReader(new InputStreamReader(in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));

    bw.write("TRIGGER");            
    bw.flush();

    String output = "";
    while (!output.endsWith(">")) {     
        System.out.println("in loop");
        output = output + br.readLine(); 
    }

    System.out.println("Out"+output);


    out.close();            
    p.waitFor();
}

编辑:adm.exe 由该程序启动,但似乎 adm.exe 是一个阻塞进程。它无法打印“in loop”语句。但是,当我打开 Windows 任务管理器并杀死 adm.exe 进程树时,这会显示在控制台上

in loopnull
in loopnullnull
in loopnullnullnull
in loopnullnullnullnull
in loopnullnullnullnullnull
in loopnullnullnullnullnullnull
in loopnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnullnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnull
in loopnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnull
Outnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnull
4

2 回答 2

1

不确定但...

定时

我了解您的执行方法在while等待某些输出及其完成时被阻塞。在您发送 TRIGGER 之前它不会出现。

我会尝试

  1. 之前发送 TRIGGER(您不会丢失任何数据,它会被缓冲)
  2. 在方法结束时使用p.waitFor()以避免退出直到 p 完成(好吧,无论如何 while 都会这样做)。

编辑

您的 adm.exe 需要用 UTF-16 编写的 TRIGGER 吗?因为如果您使用getBytes(). getBytes("UTF-8")如果您需要另一种编码(如 UTF-8 或 ASCII),请通过示例尝试。

样本

我应该这样做:

public void execute() {

String cmd = "\\\\sharedLocation\\server\\adm.exe";
Process p = Runtime.getRuntime().exec(cmd);     

// send TRIGGER before everything (I can't consume the response if I don't ask for it first)
OutputStream out = p.getOutputStream();
out.write("TRIGGER".getBytes());
out.flush(); // flush to ensure it's sent, but don't close...

InputStream in = p.getInputStream();

String output = "";
int c = 0;
while (!output.endsWith(">")){
    c = in.read(); // you've eaten this when modified your code
    output+= (char)c; // I should change the way bytes convert to char, but that's another story
}

System.out.println(output);


// optional: if I want to wait for p to finish
p.waitFor();
}
于 2012-07-23T10:18:20.923 回答
1

一些一般性评论:

  1. 不使用ProcessProcessBuilder改为使用。如果您想做比启动外部进程更复杂的事情,请使用Commons Exec

  2. 如果您只是TRIGGER在命令行上键入而不按会发生Return什么?如果没有任何反应,也请从 Java 中按 return:Wrap outin a PrintStreamand usepw.println("TRIGGER")

  3. 由于您没有得到任何输出,因此命令可能注意到它不是从命令提示符启动并且行为不同?如果是这种情况,请运行它cmd /c \\\\sharedLocation\\server\\adm.exe

  4. 始终使用列表/数组来提供命令参数以避免特殊字符出现问题

于 2012-07-23T11:56:17.403 回答