2012-07-23 59 views
0

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

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 
+0

您需要阅读的字符不要你的问题运行呢? (in.read()...) – helios 2012-07-23 11:26:43

+0

明确'flush' bw。否则它会缓冲'TRIGGER'。实际上,我不应该使用BufferedWriter。只是OSWriter。 – helios 2012-07-23 11:31:22

回答

1

一些一般性的评论:

  1. 不要使用Process,使用ProcessBuilder代替。如果你想做一些比开始外部过程更复杂的事情,请使用Commons Exec

  2. 如果您只是在命令行上输入TRIGGER而不按返回会发生什么?如果没有反应从Java,也按回车键:裹outPrintStream和使用pw.println("TRIGGER")

  3. 由于你没有得到任何输出,也许它没有被从命令提示符启动和行为不同的命令通知?如果是这样的话,用cmd /c \\\\sharedLocation\\server\\adm.exe

  4. 始终使用列表/阵列提供命令参数,以避免特殊字符

1

不知道,但...

定时

据我所知,上你的执行方法被阻止在while等待一些输出和它的结束。直到你发送TRIGGER之后才会出现。

我会尝试

  1. 发送触发前(你不会丢失任何数据,它就会被缓冲)
  2. 在方法使用p.waitFor()结束,以避免退出直至p完成(当然,无论如何同时做到这一点)。

编辑

请问您需要adm.exe TRIGGER使用UTF-16?因为如果您使用getBytes(),那就是您要发送的内容。如果您需要其他编码(如UTF-8或ASCII),请以getBytes("UTF-8")为例进行尝试。

样品

我应该这样做:

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(); 
} 
+0

是的,你是对的。我已经改变了条件,但奇怪的是它仍然没有像你说的那样执行循环。任何猜测为什么? – 2012-07-23 10:37:26

+0

我不是在抱怨这种情况,而是在发送'TRIGGER'之前放置while *。我会举一个例子... – helios 2012-07-23 11:20:39

+0

也试着先做触发器,但没有运气! – 2012-07-23 11:22:56