无法使用java将命令写入共享位置上的exe程序

无法使用java将命令写入共享位置上的exe程序,java,exe,runtime.exec,Java,Exe,Runtime.exec,我在共享位置上放置了一个exe程序。它在启动时不接受任何参数。当它在命令窗口中启动时,它会显示一个帮助菜单,其中包含可以使用它执行的命令列表,并以需要输入命令的结束。我需要从该列表中执行一个名为TRIGGER的特定命令。到目前为止,这是我所知道的,但它完全失败了。它既不显示进程的输出,也不从流中获取输入命令trigger public void execute(){ String cmd = "\\\\sharedLocation\\server\\adm.exe"; p =

我在共享位置上放置了一个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
不确定,但是

定时

我知道您的execute方法在等待一些输出和它的终结时被阻塞在
。它不会来,直到你发送触发器

我会尽力

  • 在之前发送触发器(您不会丢失任何数据,它会得到缓冲)
  • 在方法末尾,使用
    p.waitFor()
    避免在p完成之前退出(无论如何,while会这样做)
  • 编辑

    您的adm.exe是否需要使用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();
    }
    
    一些一般性意见:

  • 不要使用
    Process
    ,而是使用
    ProcessBuilder
    。如果您想做比启动外部流程更复杂的事情,请使用

  • 如果只在命令行中键入
    TRIGGER
    ,而不按Return,会发生什么情况?如果什么也没发生,也按return from Java:Wrap
    out
    PrintStream
    中,并使用
    pw.println(“触发器”)

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

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


  • 是的,你是对的。我已经改变了条件一段时间了,但奇怪的是它仍然没有像你说的那样执行循环。猜猜为什么?我不是在抱怨这种情况,而是在发送
    触发器之前放置了while。我举个例子……我添加了一个细节:使用
    flush
    not
    close
    和。。。adm.exe只需要
    触发器
    ?它不需要
    触发器\n
    触发器\r\n
    或什么吗?也许是在读台词……为什么不使用expectj来完成这些任务呢?这会容易得多?你需要读字符,不是吗?(in.read()…)最终
    flush
    bw。否则,它将缓冲
    触发器。事实上,我不应该使用BufferedWriter。我只是个作家。