• ベストアンサー

外部コマンドの実行について

・Actionクラス public ActionForward Batch(     ActionMapping objActMapping,     ActionForm objActFrm,     HttpServletRequest objHttpRequest,     HttpServletResponse objHttpResponse)     throws Exception {         ActionForward objActFwd = null;         TestForm objTestForm = null;         try {             Runtime runtime = Runtime.getRuntime();             Process process = runtime.exec("c:/Batch/Batch.bat");             objActFwd = objActMapping.findForward("success");           }           catch (Exception e) {             e.printStackTrace();             throw e;           }         return objActFwd; } 以上のActionクラスをJSPからStrutusを介し実行しておりますが バッチファイルが実行されません。 batch.bat単体では実行可能です。 ご教授お願いいたします。 環境:WindowsXP j2sdk1.4.1 Jboss-3.2.3

  • Java
  • 回答数3
  • ありがとう数5

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

  • ベストアンサー
noname#48941
noname#48941
回答No.3

考えられる原因をあげてみます。 1.まさかないとは思いますが、クライアント側のバッチを実行しようとしている。 2.バッチ実行でエラーになっている。 2.の場合、単体で実行可能でもJSPからエラーになることがありえる。 実行時のカレントパスの問題であったり、実行権限の問題だったりします。 バッチでエラーになった場合は、Exceptionでは捕らえられませんのでエラーになったことが見つけにくいです。 バッチのエラー内容は、Process#getErrorStreamで確認してみて下さい。

forgedcode
質問者

お礼

hogwan様 ご回答ありがとうございます。 1.についてはANo.2で書いた通り全てスタンドアローンでの作業です。 2.についてはこれからProcess#getErrorStreamにて確認してみたいと思います。

forgedcode
質問者

補足

ActionForward objActFwd = null; TestForm objForm = null; Process process = null;  try {    objForm = (TestForm ) objActFrm;    objForm .setBatchCheck("call");    Runtime runtime = Runtime.getRuntime();    process = runtime.exec("cmd c:/Batch/Batch.bat"); //  process.waitFor();        InputStream stream = process.getErrorStream();    while (true) {         int c = stream.read();         if (c == -1) {         stream.close();         break;     }         System.out.println((char)c); }          objActFwd = objActMapping.findForward("success")     objForm .setBatchCheck("success"); } catch (Exception e) { e.printStackTrace(); throw e; } finally {     if(process != null) { process.getErrorStream().close(); process.getInputStream().close(); process.getOutputStream().close(); process.destroy();    } } return objActFwd; 以上、getErrorStreamにて確認しようとしているのですが 反応が返ってこなくなります。 ブラウザのゲージが少しづつ伸びて1/3程度でとまってしまいます。

その他の回答 (2)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

cmdもフルパス指定してもダメ? ローカルマシンで動かしているんだよね。

forgedcode
質問者

お礼

rinkun様 再びご回答ありがとうございます。 ご指摘の通り全てローカルPC内での作業です。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

コマンドを "cmd c:/Batch/Batch.bat" にしてみたら動きませんか?

forgedcode
質問者

お礼

rinkun様 ご回答ありがとうございます。 ご指摘の通り修正をしたのですが、何の反応もございませんでした。

関連するQ&A

  • list<クラス名> とは何でしょうか?

    JAVA初心者のものです。 新規プロジェクトに向けてJAVAの習得に励んでおり、現在は「プロになるためのWeb技術入門」という本でフレームワークについて勉強しています。 ところでその本の中で次のコードがありますが、ここで List<ProductItem> は何を意味するものでしょうか? ご存知の方は教えてください。 なお、ProductItem は別の箇所で定義されたクラス名です。 public class ItemListShowAction extends Action { /* (non-Javadoc) * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { ProductLogic productLogic = new IbatisProductLogic(); List<ProductItem> productList = productLogic.getProductList(); request.setAttribute("productList", productList); return mapping.findForward("show"); } }

    • ベストアンサー
    • Java
  • ActionForm form にnullが入ってくる原因

    import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; public ActionForward execute( ActionMapping map , ActionForm form , HttpServletRequest request , HttpServletResponse response ) throws ServletException, IOException, ClassNotFoundException, SQLException { という記述をして このソースで落ちる原因を調べたら、ActionForm form の "form" でnullが入ってきていました。 なにか定義し忘れているのでしょうか?

    • ベストアンサー
    • Java
  • 外部コマンドを実行する方法

    sdk 1.4.2_08 OS WindowsXp try{ Process process = Runtime.getRuntime().exec(...); }catch(IOException e){} を使用して,コマンドを実行しようとしています.しかし,IOExceptionとなってしまいます. exec(...) に記述してある内容をコピーして,コマンドラインから実行できることは確認しましたし,パスも大丈夫でした. また空白が認識されない場合があることから, String cmd[] = {"コマンド","引数1","引数2"}; Process process = Runtime.getRuntime().exec(cmd); と行ってもダメでした. また,ためしにこのコンパイル済みのclassファイルをLinuxで動作させたところ,正常の動作できることがが確認できました.(windowsとLinuxに同じ名前のコマンドがあるのです.また,Linuxは fedora core4 です.) Windows上のコマンドに問題があるようなのですが,何か原因となる要因が,他にもありそうでしたらアドバイスお願いいたします.

    • ベストアンサー
    • Java
  • Javaで外部コマンドの実行した結果の取得

    Javaで外部コマンドを実行してその結果を取得しようとしてEclipse上で 下記サンプルを作成しました。ここで不思議なことが起きました。 下記を実行すると System.out.println(in.ready()) の部分でfalseが返り処理がwhileループの中に入らない状態です。 しかし、System.out.println(in.ready())の部分にブレークポイントを付けて1行ずつ実行していくと trueが返りwhileループの中の結果を読み取る処理にたどり着きます。 これはどういうことでしょうか。 public class Test { public static void main(String[] args) { String command = "hostname"; try { Process process = Runtime.getRuntime().exec(command); BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); System.out.println(in.ready());             while(in.ready()) { } in.close(); } catch(Exception e) { e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • Runtime#proccessのwait

    //Batch part RunBatch(batchName); //sleep(1000); //B-part Systems.out.println("B-part"); --------------------------------------------------------- public void RunBatch(String BatchName)throws Exception {  Process pr = null;  Runtime runtime = Runtime.getRuntime();  pr = runtime.exec("cmd.exe /c start "+BatchName);  try {    int exitCode = pr.waitFor();    if(process != null) {      process.getErrorStream().close(); process.getInputStream().close(); process.getOutputStream().close(); process.destroy(); }  } catch (Exception e) {   e.printStackTrace();  } } このままですとバッチの処理が長い場合、処理が終了する前にB-partへ 処理が移行してしまいます。 とりあえずでwaitをかけてはいるのですが、完全にバッチ処理が終了 するまでB-partへ移行させない方法はありませんでしょうか? おそらくバッチファイルから結果出力させてJAVA側でフックするとは思うのですが、具体的にどう組めばいいのかが分かりません。

    • ベストアンサー
    • Java
  • JAVAで外部ファイルの実行

    JAVAで外部ファイルを実行したいのですが、 myjbutton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ Runtime myruntime=Runtime.getRuntime(); try{Process myprocess=myruntime.exec("cmd.exe");}catch(IOException e){}; }}); ボタンを押して、実行させたいのですが、これが 全く起動しません。notepad.exeなども試しました が無理でした。 アドバイスがあれば、教えてください。お願いします。

    • ベストアンサー
    • Java
  • 「Struts使用中」XMLからデータ取得

    FormBeanにセットされた値を取得して、その値を元に一致するデータをXMLからとってきてそれらをテキストに落とし込む。という動作です。 最初はFormBeanにセットされた値をそのままテキストに落とし込むだけだったので楽にできて正常に動いていましたが、「XMLからとってくる」という動きを追加しようとしたところうまくいきません。 public class Test extends Action { (1) public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) {   FormBeanからキーになる値をとってくる。 } (2) public static void main(String[] args) throws Exception { Document document = DocumentBuilderFactory.newInstance()  キーとなる値を元にXMLからデータ検索し、値を取得 } (3) public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) {   そのほかのFormBeanの値をとってきて(2)で取得した値と一緒にテキストに落とし込み、returnで処理終了のjspを表示させる }  public ActionForward executeが(1)と(3)で2回でているからコンパイルエラーがでるのだとわかるのですが、その他の記述方法がわかりません。  ネットでいろいろ探したのですが、XMLparserのサンプルやStrutsのサンプルはあるのですが、2つ一緒のサンプルが見つからないので困っています。  ご存知の方よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Servletでcsvファイル読込

    Servletからcsvファイルを読込む処理を作成しています。 しかし、FileNotFoundExceptionが発生してファイルを読込めません。 下記のように記述した場合、csvファイルはどこに置けばよいのでしょうか? いろいろファイルの置き場所を変えてはやってみましたがダメでした。 package action; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; public class MemberEntryAction extends Action{ public ActionForward execute(ActionMapping mapping,ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { try { // 入力ストリームを作成。 FileReader fr = new FileReader("a.csv"); BufferedReader br = new BufferedReader(fr); // 読込みループ。 String line; // 読み込まれた1行。 while( (line = br.readLine()) != null ) { System.out.println(line); } // 入力・出力ストリームを閉じる。 br.close(); fr.close(); } catch ( FileNotFoundException e ) { System.out.println("FileNotFound!"); } return mapping.findForward("memberMenu"); } }

  • 外部プロセスの起動

    いつもお世話になっています. 現在JAX-RSのプログラムで特定のアドレスへ移動すると外部のbatファイルが起動する,というプログラムを書いています. batファイルの内容はjavaプログラムを二つ起動する,というものです. そのアドレスに移動するとbatファイル自体は起動するのですが”エラーメインクラスがみつからなかったかロードできませんでした”と表示されてコマンドプロンプトのウインドが一瞬で閉じてしまいます. どのように対処すればいいでしょう?ご教授お願いします. なお,ソースコードは以下の通りです ==================================================================================== @GET//スイッチのON @Path("/ON") public static boolean OnSwitch(){ //機器の電源をONにする //機器ごとの通信ミドルウェアを呼び出す button=true; if(button==true){ String output="lightの状態は :"+ button; String filename = "C:\\start.bat"; try { System.out.println("実行中"); Process proc = Runtime.getRuntime().exec(filename); proc.waitFor(); System.out.println("実行終了"); } catch( Exception e ) { System.out.println(e); } } return button; } ==================================================================================== 以下はbatファイルの内容 =============================== start java okaeriZZZ2 start java TheaterZZZ2 =============================== 以上です.

    • ベストアンサー
    • Java
  • VBSからbat実行(WMI)して戻り値を取得する

    WSH初心者です。 WSH(remote.vbs)からWMI使用で別サーバのA.batを実行しているのですが、 A.batの戻り値はどのように取得すれば良いのでしょうか? -■remote.vbs(一部抜粋)------------------------------------------ ' #WMI に接続 Wim32_Process クラスを取り出す Set clsProcess = GetObject("winmgmts:{impersonationLevel=impersonate}" & "!" & リモート先PC & "Win32_Process") ' #プロセスの作成 lngResult = clsProcess.Create(A.bat, null, null, processId) -------------------------------------------------------------- -■A.bat------------------------------------------ exit /B %RetCode% ------------------------------------------------- A.batで返している%RetCode%の値をremote.vbs側で取得したいのです。 どなたかご存じでしたらご教授の程よろしくお願い致します。

専門家に質問してみよう