2012-12-12 9 views
6

私はこれが可能であると思ういけないが、私が使用している:コマンドラインでコマンドを実行するRuntime.getRuntime()を使用している場合のコマンドラインへのユーザー入力。exec(コマンド);

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

を、今私は私がの途中を実行しているコマンドが要求されます状況accrossに来ていますいくつかのユーザ入力、例えばユーザ名。

これはexecであるコマンドの引数では解決できません。ユーザー名を同じコマンドラインインスタンスに渡して続行する方法はありますか?

---編集---

私はまだこれを動作させることはできません。これらはコマンドラインの手順です。

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"); 
    } 

アイブのようなもの試した:私はそれdoesntの仕事持っているコード 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シェルコマンドを付加でき入力として読み取ることができます。

コマンドは、cat user_input.txt | myAppWantsInput.plのようなコマンドです。

これは、user_input.txtのコンテンツを取る標準でにそれをダンプし、そのとき「myAppWantsInput.pl」あなたcommand実行中、および標準で、それはファイルの内容を読み取り、ことを取るようになるから読み込みますあたかもキーボードから入力されたかのように入力します。

先験的にあなたが渡そうとしている値は、コマンドを呼び出す前に動的に必要なファイルを生成することができます。これは、コマンドを実行する前にすべての入力を判別できない場合は機能しません。

+0

私は彼が入力をProcessインスタンスに送信したいと思いますが、それを実行しているJava VMには送信しません。 – javawizard

+1

@javawizard私は何らかの理由で彼のコマンドが別のJavaアプリケーションを開始していると想定していましたが、より一般的な答えを更新しました。コマンドの実行可能ファイルの実装に関係なく、私のアプローチはうまくいくはずです。 – ArtB

関連する問題