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

标签 java exe runtime.exec

我有一个 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 是一个阻止进程。它无法打印“循环中”语句。但是,当我打开 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

最佳答案

一些一般性评论:

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

  2. 如果您只在命令行中键入 TRIGGER 而不按 Return 会发生什么?如果没有任何反应,也按 Java 的 return:将 out 包装在 PrintStream 中并使用 pw.println("TRIGGER")

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

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

关于java - 无法使用 java 将命令写入共享位置上的 exe 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11610472/

相关文章:

java - 如何杀死我们在java中使用exec启动的进程 {.exec ("cmd/c"+command)}

java - 如何加速 Tomcat SSL 初始化

java - 使用 Ant 进行 JDBC COPY

java - 拦截器没有被称为 retrofit2

c# - 找到 .exe 的图标

java - 如何在java中打开终端窗口并执行客户程序

java - 关于apache Ignite服务实现

c++ - 如何定位可执行文件中函数所在的位置?

gradle - 如何从使用openJavaFx 11开发的Java应用程序构建(gradle).deb和.exe

java - "ProcessBuilder.command"的参数语法