2014-04-20 90 views
-1

最近我正在尝试编写一个Java应用程序来调用SCM.exe来执行代码加载作业。但是,在通过java成功执行SCM load命令后,我发现我实际上无法真正下载代码(如使用命令行,需要在执行SCM load命令后输入密码)。我是否可以知道在我使用该过程在java中运行SCM之后如何输入此密码?如何获得命令行的输出并在命令行中输入内容?通过JAVA应用程序调用SCM

万分感谢, 埃里克

回答

0

因为我不知道到底是什么SCM.exe你的情况是,我回答,在抽象意义上的输入/输出重定向的要求仅涉及什么。我进一步假设你正在通过System(“...”)调用它需要的任何参数的SCM.exe,这是你无法通过任何进一步输入(被调用进程的标准输入)的地方。

您需要在接收到密码请求时将其传递给另一个进程的stdin,这通过使用传统意义上的管道来解决(因为您大概在Windows上,YMMV )。更一般地说,你正在处理一个非常简单的IPC案例。在Java中,你可以通过使用ProcessBuilder [1]找到一个合适的解决方案(虽然我从来没有这样做过 - 为了这个目的,我使用的东西比java简单得多,但我离题了......)。

溶液的概要是:

  1. 呼叫的过程中,具有其输入和输出作为输出/输入从呼叫者java程序流被处理。
  2. 读你的程序的输出,直到您查询密码
  3. 的密码写
  4. 根据需要进行。

如果您需要进一步说明,您可能需要提供有关您的方案的更多详细信息。

[1] http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html

+0

我已经找到了解决方案来解决它,非常感谢 –

+0

请问你介意(或描述)你的解决方案(可能是对原始问题的编辑),以便对此问题感兴趣的其他人可以将其作为参考。 – h7r

+0

请在下面看到我的回复,谢谢你的帮助 –

0

公共类的测试{ 公共静态无效的主要(字串[] args){

try { 
     System.out.println(""); 
     String commands = "C:/swdtools/IBM/RAD8/scmtools/eclipse/scm.exe load -d C:/users/43793207/test -i test -r eric-repo"; 
     // load -d C:/users/43793207/test -i test -r eric-repo 

     test test=new test(); 
     test.execCommand(commands); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public void execCommand(String commands){ 
    //ProcessBuilder pb = new ProcessBuilder(Command); 
    //pb.start(); 
    String line; 

    try { 
     //Process pp = Runtime.getRuntime().exec(commands); 
     System.out.println(commands); 
     Process process = new ProcessBuilder(commands).start(); 
     InputStream is = process.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 


     while ((line = br.readLine()) != null) { 
      System.out.println(line); 
       } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

这个代码有一个错误,当我输入命令如“C:/swdtools/IBM/RAD8/scmtools/eclipse/scm.exe”时,它会运行顺利。但是当我输入“C:/swdtools/IBM/RAD8/scmtools/eclipse/scm.exe加载-d C:/用户/ 43793207/test -i测试-r eric-repo”等附加参数时,它会触发一个错误,“CreateProcess error = 2,系统找不到指定的文件”,任何机构都可以提出任何解决方案来解决它? –

+0

正如ProcessBuilder文档中所述(链接在我的上面的答案中)以及通过参数启动其他进程的常用方式,您的进程的每个参数(从'load -d'开始的所有内容)都将作为附加字符串传递。您调用的方式将'C:'到'eric-repo'(包含空格)作为可执行文件路径。参考SO中的其他答案可以得出同样的结论。此外,根据常规惯例(即测试,而不是测试)来命名您的课程将是一种很好的做法。 – h7r

+0

非常感谢您的建议:) –

相关问题