2011-07-18 16 views
0

WindowsでCMDを使って直接コマンドを実行しようとしています(Linuxのターミナル)。私は次のコードを持っています。それは非常に奇妙なことです。まず、実行時にプログラムは何も印刷しません。次に、デバッグしてステップスルーすると、プログラムはデフォルトのCMDテキストと入力行を出力します。最後に、コマンドを実行するようにCMDに書き込むことはできません。ここに私のコードです。私はそれがスレッドの問題かもしれないと思っていますが、私はランタイムに精通していません。CMDをプロセスとして使用する

Runtime r = Runtime.getRuntime(); 
    try { 
     Process p = r.exec("cmd"); 
     InputStream iStream = p.getInputStream(); 
     BufferedReader sReader = new BufferedReader(new InputStreamReader(iStream)); 
     while(sReader.ready()) { 
      System.out.print((char)sReader.read()); 
     } 

     OutputStream oStream = p.getOutputStream(); 
     BufferedWriter sWriter = new BufferedWriter(new OutputStreamWriter(oStream)); 
     sWriter.write("mkdir test"); 
     sWriter.newLine(); 

     while(sReader.ready()) { 
      System.out.print((char)sReader.read()); 
     } 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 

そして、私の出力デバッグおよびを通じて段階、

Microsoft Windows XP [Version 5.1.2600] 
(C) Copyright 1985-2001 Microsoft Corp. 

D:\workspaces\Maven\Command Line> 
+1

各コマンドを直接実行するのではなく、 'cmd'を使用する理由はありますか? – unholysampler

+3

@unholysampler:これがWindows上で実行されることを意図している場合は、このようにする必要があります(または 'cmd/c mkdir test'を1行で実行する必要があります)。 'mkdir'はWindowsコマンドプロセッサーに組み込まれています。別の実行可能ファイルではありません。もちろん、標準のライブラリの代わりに 'cmd'を使って' mkdir'コマンドを実行する必要があるのはなぜですか?(http://download.oracle.com/javase/6/docs/api/java/io/File.html #mkdir())は私の外にあります。 – ig0774

+0

私はmkdirを使用していません、私は単純な例のために使用しました。実際のCMDコマンドは動的な値で長くて醜いです。 – Spidy

答えて

1

何か起こっている可能性があります。 1つは、プロセスを実行しているように引数が正しく渡されないということです。もう1つは、前述の@ zacheuszのように、出力が入力ストリームの代わりにエラーストリームから出てくる可能性があるということです。

ProcessBuilderはこれらの両方をサポートしているため、コマンドリストと入力ストリームとエラーストリームをマージする機能を簡単に構築できます。私はそれを使用してしようとお勧めします。

Process p = null; 
try { 
    List<String> cmd = new LinkedList<String>(); 
    cmd.add("executable"); 
    cmd.add("-arg1"); 
    cmd.add("value1"); 
    cmd.add("-arg2"); 
    ProcessBuilder pb = new ProcessBuilder(cmd); 
    pb.redirectErrorStream(true); 
    p = pb.start(); 
    BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    while (input.ready()) { 
     String line = input.readLine(); 
     System.out.println("From process: "+line); 
    } 
    input.close(); 
} catch (IOException e) { 
    this.logMessage("IOException caught: "+e.getMessage()); 
    e.printStackTrace(); 
} 
1

あなたがスレッドで、この作業を行う必要があります(何も出力は、その実行が時に表示されません)。たとえば、標準出力を記録するには:

Process process = Runtime.getRuntime().exec(command); 
LogStreamReader lsr = new LogStreamReader(process.getInputStream()); 
Thread thread = new Thread(lsr, "LogStreamReader"); 
thread.start(); 


public class LogStreamReader implements Runnable { 

    private BufferedReader reader; 

    public LoggingStreamReader(InputStream is) { 
     this.reader = new BufferedReader(new InputStreamReader(is)); 
    } 

    public void run() { 
     try { 
      String line = reader.readLine(); 
      while (line != null) { 
       System.out.println(line); 
       line = reader.readLine(); 
      } 
      reader.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

次に、入力処理のために2番目のスレッドが必要です。そしてstdoutのようにstderrを扱いたいかもしれません。

0

通常、cmdまたはterminalは、実行するプログラムの標準ioを設定する責任があるため、入出力ストリームを介して通信することはできません。 Linuxの場合は、実際には、端末の内部で実行されるシェルであり、端末自体ではなくコマンドを実行します。 Windowsはおそらくファンキーなこともするでしょう。

1

このコードは正式な年前に見つかりました。私はどこを覚えていない。それはかなり古くなっているので、そこにはもっと良いものがあるかもしれません。あなたが実際にハードコードにCMD.EXEをコーディングせずにコマンドを実行することができます

import java.util.*; 
import java.io.*; 

public class StreamHandler extends Thread { 
    InputStream is; 
    String type; 
    OutputStream os; 

    StringBuffer output; 

    StreamHandler(InputStream is, String type) { 
     this(is, type, null); 
    } 

    StreamHandler(InputStream is, String type, OutputStream redirect) { 

     this.is = is; 
     this.type = type; 
     this.os = redirect; 
     output = new StringBuffer(100); 
    } 

    public void run() { 
     try { 
      PrintWriter pw = null; 
      if (os != null) 
       pw = new PrintWriter(os); 

      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      String line=null; 
      while ((line = br.readLine()) != null) { 
       if (pw != null) 
        pw.println(line); 
       System.out.println(type + ">" + line); 
      } 
      if (pw != null) 
       pw.flush(); 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 
    } 
} 
-1

private void executeCommand(String cmd) { 
     try { 
      Runtime rt = Runtime.getRuntime(); 

      Process proc = rt.exec(cmd); 

      // any error message? 
      StreamHandler errorGobbler = new StreamHandler(proc.getErrorStream(), "ERR"); 

      // any output? 
      StreamHandler outputGobbler = new StreamHandler(proc.getInputStream(), "OUT"); 

      // kick them off 
      errorGobbler.start(); 
      outputGobbler.start(); 

      // any error??? 
      int exitVal = proc.waitFor(); 
      System.out.println("ExitValue: " + exitVal); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 


    } 

とクラス。

public static void main(String[] args) { 

     //cmd = the command youw ill be using    
    String cmd = "ipconfig";  
    Runtime r = Runtime.getRuntime();  
    Process p; 
    try {  
     p = r.exec(cmd); 

    BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));  
    String inputLine;  
    while ((inputLine = in.readLine()) != null) {  
     System.out.println(inputLine); 
      }  
    }  


catch (IOException ex) {  
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
+0

理由はありますか? :(これは合理的な答えと思われます。 – sealz

-1

CMDを適切にコマンドを実行するために、コマンドプロンプトを実行するために

をしようとしますが、次のコマンドラインを必要とする

cmd.exeの-c IPCONFIG.EXE

-cは残りのコマンドラインでコマンドを実行することを意味します

関連する問題