2012-12-12 84 views
6

我不認爲這是可能的,但我一直在使用:使用Runtime.getRuntime()。exec(command)時,用戶輸入到命令行;

Process p = Runtime.getRuntime().exec(command); 

運行命令行命令,但現在我已經來了防空火炮的情況下命令我運行部分的方式,通過將要求一些用戶輸入,例如用戶名。

這不能通過正在執行的命令的參數來解決,有沒有什麼辦法可以將用戶名傳遞給同一個命令行實例並繼續?

---編輯---

我仍然無法得到這個工作。這些是在命令行上的步驟:

C:\someProgram.exe 
Login: 
Passowrd: 

所以我需要通過登錄名和密碼,當它在運行時提示。該代碼我有一個不工作:

try { 
     String CMD = "\"C:\\someProgram\""; 
     Scanner scan = new Scanner(System.in); 
     ProcessBuilder builder = new ProcessBuilder(CMD); 
     builder.redirectErrorStream(true); 
     Process process = builder.start(); 

     InputStream is = process.getInputStream(); 
     BufferedReader reader = new BufferedReader (new InputStreamReader(is)); 
     OutputStream out = process.getOutputStream(); 
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out)); 
     String line; 
     try { 
      while (scan.hasNext()) { 
       String input = scan.nextLine(); 
       if (input.toLowerCase().startsWith("login")) { 
        writer.write("myUsername"); 
       } else if(input.toLowerCase().startsWith("password")){ 
        writer.write("myPassword"); 
       } 
       writer.flush(); 

       line = reader.readLine(); 
       while (line != null) { 
        System.out.println ("Stdout: " + line); 
        line = reader.readLine(); 
       } 
       if (line == null) { 
        break; 
       } 
      } 
      process.waitFor(); 
     } 
     finally {; 
      writer.close(); 
      reader.close(); 
     } 
    } 
    catch (Exception err) { 
     System.err.println("some message"); 
    } 

我用盡了諸如: writer.write( 「名爲myUsername \ n」);

任何幫助,我可以看到someProgram.exe被稱爲並在進程中運行,但它只是掛起。

+0

你是否檢查過程是否有任何方法來做到這一點? –

+0

是的,例如Process#getOutputStream():) – hoaz

回答

2

只需寫入p.getOutputStream()即可。這會將用戶名發送到進程的標準輸入,這應該是你想要的。

out = p.getOutputStream(); 
out.write("fooUsername\n".getBytes()); 
out.flush(); 
0

您應該重定向命令輸入並在那裏發送參數。使用process.setInputStream(),寫入這個流。

+1

沒有process.setInputStream() – hoaz

0

由於零件的command字符串,如果你是在Unix/Linux/OSX運行和也許 PowerShell中,你可以在前面加上cat shell命令有殼轉儲文件的內容到你想要的輸入流可執行文件作爲輸入讀取。

一個類似於cat user_input.txt | myAppWantsInput.pl的命令。

這將需要的user_input.txt的內容,它轉儲到標準中,所以當「myAppWantsInput.pl」你command執行,並從標準中,將讀取該文件的內容,並採取讀取作爲從鍵盤輸入的輸入。

當然,你不知道先驗你打算通過什麼值,你可以在調用命令之前動態生成你需要的文件。如果在運行命令之前無法確定所需的所有輸入,則這將不起作用。

+0

我認爲他想將輸入發送到Process實例,而不是發送到運行它的Java VM。 – javawizard

+1

@javawizard由於某種原因,我認爲他的命令啓動了另一個Java應用程序,我已經更新了我的答案,使其更加通用。無論命令的可執行文件的實現如何,我的方法都應該可以工作。 – ArtB

相關問題