• ベストアンサー

exec を使ってcmdを動かす

現在、javaのexec関数を使ってcmdを実行したいのですが、うまく動作しなくて困っています。 ソースコードで説明すると、 try { Runtime r = Runtime.getRuntime(); Process p=       r.exec(newString[{"cmd.exe","/k","del","a.txt"}); } catch { } この様なソースでcmdを立ち上げて、a.txtというファイルを消去したいのですが、このプログラムを実際に動かすとa.txtはきえず、またcmdの画面も表示されません。 しかし、エラーは表示されずまたcmd.exeをnotpad.exeに変更するとちゃんとnotpadが立ち上がります。 どのあたりのソースがおかしいのでしょうか?ご指摘お待ちしております。

  • Java
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • Lchan0211
  • ベストアンサー率64% (239/371)
回答No.2

Runtime.exec()でcmd.exeを実行しても、画面は表示されません。 cmd.exeの実行結果(標準出力)は、p.getInputStream()で得られる、 インプットストリームに出力されます。 (参考) http://www.ne.jp/asahi/hishidama/home/tech/java/process.html 今回は、単純に1コマンドを実行したいだけなので、 /kパラメータでなく、/cパラメータを使うべきです。 (/kを指定した場合、cmd.exeは自動的に停止しません。) ただ、指定ファイルが削除されない原因は、/kとは別の話で、 以下のような可能性が考えられると思います。 ・cmd.exe実行時のカレントフォルダがa.txtと別のフォルダになっている ・このJavaプログラムを実行しているユーザに、a.txtのファイルアクセス権がない 原因がよくわからなければ、p.getInputStream()およびp.getErrorStream() を取得すると、エラー原因が表示されている可能性があります。 それと、開示されたソースには文法エラーがあります。 newString[{"cmd.exe","/k","del","a.txt"} ↓ new String[]{"cmd.exe","/k","del","a.txt"} 実際にうまくいかないソースをコピペで貼り付けた方がよいと思います。

lain_003
質問者

お礼

お返事ありがとうございます。 色々試した結果、ここには書いていなかったのですが開発環境がEclipseだったのですが、コマンドプロンプトから直接コンパイルして実行すると消すことができました。 この関数で実行しても画面は表示されないのですか、勉強になりました。

その他の回答 (1)

回答No.1

>r.exec(newString[{"cmd.exe","/k","del","a.txt"}); これを r.exec(newString[{"cmd.exe","/k","del a.txt"}); かな? "del a.txt"で"cmd.exe"のひとつのオプションですから。

lain_003
質問者

補足

お返事ありがとうございます。 言われた通りやってみたんですが、a.txtはきえませんでした。 それに、/kで動作さしてるのにcmdの画面が表示されないのも気になります。 やはりcmdが立ち上がっていないのでしょうか?

関連するQ&A

  • Runtime.execについての質問

    こんにちは、Makotoと申します。 Runtime.execを使って、ディレクトリを作成する プログラムを作っているのですが、下記のプログラムで ディレクトリは作成されるのですが、コマンドプロンプト画面が 立ち上がったままになってしまいます。閉じようと思い、8行目でexitコマンド を発行してみたのですが、うまくいきませんでした。このウィンドウを閉じる 方法はあるのでしょうか? 1:public class test{ 2:  public static void main(String[] args) throws Exception { 3:    Runtime rt = Runtime.getRuntime(); 4:    Process pr; 5:    try { 6:      Process proc1 = rt.exec("cmd /C start /MIN 7:               mkdir c:\\\poi\\test"); 8:      proc1 = rt.exec("command.com, /, exit"); 9:    } catch (java.io.IOException e) { 10:     System.err.println(e); 11:     System.exit(1); 12:    } 13: 14: } 15:}

    • ベストアンサー
    • Java
  • execでdirコマンドを実行すると停止します

    質問です。 javaのプログラム内で command = "cmd /c dir *.java /a-d"; r = Runtime.getRuntime(); p = r.exec(command); p.waitFor(); p.destroy(); こう書くと問題なく進行するのですが command = "cmd /c dir *.java /a-d/s"; r = Runtime.getRuntime(); p = r.exec(command); p.waitFor(); p.destroy(); のように/sオプション(サブディレクトリ内も検索する)を付けると p.waitfor(); 部分で動作が停止します。 ファイルの探索に時間がかかっているとかではなく、完全に動作が停止しているようなのですが原因がわかりません どなたかよろしくお願いします。

    • ベストアンサー
    • Java
  • ネットワーク上の他のパソコン内のjarを実行したい。

    ネットワーク上の他のパソコン内のjarを実行したい。 実行して他のパソコンの中で動かしたいですが、反応がありませんでした。 他のパソコン側のセキュリティ設定や、jarファイルへの設定が必要なのでしょうか。 また、他の方法で同じことはできませんでしょうか。 ご存知の方がおられましたら教えてください。 よろしくお願いいたします。 以下は、試したソースです。 import java.io.IOException; public class exec { public static void main(String[] args) { // ネットワーク上のjarを実行したい。 try { //Runtime.getRuntime().exec("cmd /c start //myPC/log/test.jar");//反応なし //Runtime.getRuntime().exec("cmd /c start //myPC/log/test.txt");//反応なし Runtime.getRuntime().exec("cmd /c start C:/log/test.jar");//実行できる Runtime.getRuntime().exec("cmd /c start C:/log/test.txt");//実行できる } catch (IOException e) { e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • Runtime.getRuntime().execの使い方

    Javaプログラムを実行するだけで、コマンドプロンプトを起動させ、 Mecabを動かしています。 try { String[] command = new String[8];  command[0] = "cmd.exe";  command[1] = "/c";  command[2] = "C:\\Program Files\\mecab\\bin\\mecab.exe";  command[3] = "-F";  command[4] = "\"%m,%f[0]\"";  command[5] = "result.txt";  command[6] = ">";  command[7] = "output.txt";  process = Runtime.getRuntime().exec(command);  以下省略 上のようにすると、output.txtにうまく出力してくれません。 ちなみに、  command[3] = "-F";  command[4] = "\"%m,%f[0]\""; の部分を省くとうまくoutput.txtに書き込まれます。 出力フォーマットを指定する方法はありますでしょうか。 またMecab単体を起動させて mecab -F "%m,%f[0]" result.txt > output.txt …(1) (1)のように入力するとうまくいきます。 Javaプログラムで(1)を実行させたいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • javaでwgetを動作させる際に

    wget.exeを動作させると、日本語のファイルを取り出す際に文字が 化けてしまうため、java言語を用いてwget.exeを動作させ、文字 コードを指定することによって文字化けを解消させようと考えて おりますが、その方法がわかりません。 アドバイスの方お願いします。 以下は、現在できているソースです。 import java.io.*; public class wget { public static void main(String[] args) { String[] command = {"cmd.exe", "/c", "C:\\wget\\bin\\wget.exe", "-r", "-l", "1", "-k", "-np", "-nv", "http://dmoz.org/World/Japanese/"}; // 例外の発生を調べるブロック try { Runtime runtime = Runtime.getRuntime(); Process load_process = runtime.exec(command); load_process.waitFor(); } // 例外発生時の処理ブロック catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • Runtime.getRuntime().exec("cmd /c start run.bat");でコマンドプロンプトが出ないようにしたい

    WindowsXPにおいてJavaのプログラムから Runtime.getRuntime().exec("cmd /c start run.bat"); としてbatファイルを呼び出しています。 このようにすると、batファイルの起動はできるのですが、黒いwindowが出てしまいます。windowを出さずに同様の結果となる方法はありますか?

  • Runtime.exec()について

    Runtime.exec()について質問させて下さい。 現在、Windowsのサーブレット上のファイル操作で ファイルの属性ごと(読み取り専用)コピーしたいので Runtime.exec()からxcopyコマンドを呼び出してコピーしています。 (JavaのAPIでは属性ごとコピー、属性変更ができない!?ため) エディタはeclipse3.5を使用しております。 eclipse上のTomcat6.0では綺麗にコピーしてくれるのですが、 Tomcat6.0のみでの実行ではコピーできません(0個のファイルをコピー) eclipse3.5上のTomcat設定とTomcat自体のJVM設定でのJREパスは同じJRE を参照しています。常にEclipseを起動させた状態!!ってのは厳しいので なんとかTomcatのみでコピーを成功させたいので助言お願いいたします。 下記ソースで 4個の読み取り属性を強制上書きコピーしますと、表示は Eclipse3.5上では → 「4個のファイルコピーに成功」表示 Tomcat6上では   → 「0個のファイルコピーに成功」表示 となります。。。 【以下ソース】 CopyFrom = "コピー元パス"; CopyTo  = "コピー先パス"; try{  String[] cmd = new String[]{"cmd","/c","xcopy",CopyFrom+"*.*",CopyTo,"/y","/r","/k","/h"};  Runtime Run = Runtime.getRuntime();  Process process = Run.exec(cmd);  //実行結果取得  InputStream is = process.getInputStream();  BufferedReader br = new BufferedReader(new InputStreamReader(is));  String Line = null;  while((Line = br.readLine()) != null){   System.out.println(Line);  } }catch(IOException e){  System.out.println(e); } 【環境】 ・Windows Server2003 ・Java1.6.0_13(パスは通しています) ・Tomcat6.0.14

    • ベストアンサー
    • Java
  • Runtime クラスのexecメソッドについて

    javaで、Runtimeのexec()メソッドを使って、出てきた内容をJTextAreaに出力したいと思っています。つまり、JTextAreaをコマンドプロンプト風にしたいと思っています。しかし、exec()メソッドの戻り値である、Processクラスがいまいちよくわかりません。仕様書(日本語訳)を読んでもProcessクラスのgetInputStream()メソッドやgetOutputStream()メソッドの説明がいまいちピンときません。 try{ Process process = Runtime.getRuntime().exec("hogehoge"); /*---------------------------------------------------------*/ ここで、いかにしてJTextAreaに出力するのかわかりません /*---------------------------------------------------------*/ }catch(Exception e){ } どうか、わかる方よろしくお願いします。

    • ベストアンサー
    • Java
  • JAVAとGnuplot

    javaからGnuplotを起動させ、グラフのプロットを行いたいのですがうまくいきません。 ソースは String gnuplot_cmd = "plot sin(x)" ; try { p = Runtime.getRuntime().exec("C:~省略~\\wgnuplot.exe"); } catch (IOException e) { e.printStackTrace(); } pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(p.getOutputStream()))); pw.print(gnuplot_cmd); pw.close(); です。 起動はするのですが、プロットの命令がうまく伝わりません。 よろしくお願いします。

    • ベストアンサー
    • Java
  • Java getRuntime().exec() でのパイプ利用に関して。

    はじめまして。 JavaのgetRuntime().execでコマンドプロンプトを動かそうと思っております。 コマンドプロンプトで「netstat -an | find "***"」というコマンドをJavaから実行したいと思っています。 しかし、Javaではパイプ(=|)を利用したコマンドは実行できない。 ということを検索してたどり着きました。 例などでは、「シェル」を利用しろ。などとかかれていましたが何をどうすればいいかわかりません。 String[] s = {"netstat","-an"}; Process process = Runtime.getRuntime().exec(s); 今は上記の状態で「netstat -an」が実行されています。 どうすれば「find "***"」で***の検索をかけることができるでしょうか? どうぞ、よろしくお願いいたします。

    • ベストアンサー
    • Java