输入参数并在Runtime.execute()中通过java swing应用程序继续执行cmd命令

时间:2013-07-15 19:53:07

标签: java swing cmd

我在构建过程中有一个ant命令,当我从执行命令提示符执行该命令时,它会提示我输入密码,当我输入密码并按回车键时,它会继续执行并让我成功消息。

现在我想用编程方式使用Runtime.execute(...)在java中做同样的事情;并且它在提示密码之前工作正常(我正在读取命令提示符的输出)但我不知道如何在cmd输出提示输入密码时显示一个对话框,我可以输入密码密码我的程序继续执行并成功完成。我想从命令提示符手动执行相同的操作。

所以问题是,是否可以在Runtime.execute执行命令之间输入参数,如果是的话,如何恢复命令执行传递参数?

执行命令的swing应用程序很简单,我想使用Swing Ui对话框来获取密码。

根据Andy Thomas的建议更新了我的代码:

Process p1 =Runtime.getRuntime().exec("cmd /C my command", null, myProject);
BufferedReader in = new BufferedReader(  
                            new InputStreamReader(p1.getInputStream()));  
String line = null;  

while ((line = in.readLine()) != null) {  
   System.out.println(line);
   if(line.contains("Please enter password")){
       System.out.println("Prompting for password ");
       OutputStream child_stdin = p1.getOutputStream();
       BufferedWriter child_writer = new BufferedWriter(new OutputStreamWriter( child_stdin ));
       child_writer.write( "password123" );
        child_writer.flush();

            }

        }  

    }

但没效果。

2 个答案:

答案 0 :(得分:1)

当你调用Runtime.exec()时,你会得到一个代表子进程的Process对象。

  1. 从子进程的输出流中读取 - 由Process.getInputStream()提供 - 直到您检测到密码请求。
  2. 要求用户输入密码,最好使用JPasswordField,以便隐藏密码。
  3. 输入由Process.getOutputStream()提供的流程输入流的密码。
  4. 继续读取子进程的输出流,否则子进程可能会阻塞。
  5. 编辑:这是一个草图(未经过测试),您将如何根据以下评论的要求为子进程编写String userPassword。 ......忽略了从子进程的输出流中读取的部分,没有这部分,子进程可能会阻塞。

        Process process = Runtime.getRuntime().exec("...");
        ...
        OutputStream child_stdin = process.getOutputStream();
        BufferedWriter child_writer = new BufferedWriter(new OutputStreamWriter( child_stdin ));
        child_writer.write( userPassword );
        child_writer.newLine();  // suggested by OP
        child_writer.flush();
    

答案 1 :(得分:1)

作为替代方案,请将密码从安全文件加载到ant,如herehere所示。