この人頭いいなと思ったエピソード

//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側でフックするとは思うのですが、具体的にどう組めばいいのかが分かりません。

A 回答 (6件)

残念ながら、SWTもOSネイティブな機能を使うのでだめなようです。


「通常のwindow」として、
 Xemacs
を利用すると旨くいったようなので、
もっと適切な方法もあるかと思いますが、お知らせします。

1.まず通常のwindowを開く。
     Xemacsを起動する
2.そこから、バッチ処理を起動する。
     Xemacsのメニューで、[Tools]-[Shell]-[Shell]を選択し
     バッチコマンドを実行する。
3.バッチ処理終了後、windowを閉じる。
     Xemacsを閉じる。

ここでようやくprocess.waitFor()が終了し、今まで抑止されていたB-partへ
移行するようです。

------------------------------------------------------------------------
秀丸等でも類似の機能があれがそれを使えばよいわけですが、今回試したXemacs
のインストールは、
http://www.xemacs.org/Download/index.htmlのFor Windows 95, 98, NT, 2000, XP: You can get the current stable version of XEmacs InnoSetup install kit (Install Now!).
から
XEmacs_Setup_21.4.21.exe
をダウンロードしました。
------------------------------------------------------------------------

作成したプログラムRuntime1.java
------------------------------------------------------------------------
public class Runtime1 {

public static void main(String[] args) {
// Batch part
String batchLauncher = "\"C:\\Program Files\\XEmacs\\XEmacs-21.4.21\\i586-pc-win32\\xemacs.exe\"";
try {
runBatch(batchLauncher);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// sleep(1000);
// B-part
System.out.println("B-part");
}

static void runBatch(String batchLauncher) throws Exception {
Process process = null;
Runtime runtime = Runtime.getRuntime();
process = runtime.exec(batchLauncher);
try {
process.waitFor();
if (process != null) {
process.getErrorStream().close();
process.getInputStream().close();
process.getOutputStream().close();
process.destroy();
}

} catch (Exception e) {
e.printStackTrace();
}
}
}
------------------------------------------------------------------------
バッチ処理をしている間、Runtime1は通常のwindowのおかげで
止まっていると思います。
-----------------------
たか
    • good
    • 0
この回答へのお礼

auty様
返事送れて申し訳ございません
ご回答ありがとうございました。

確かにちゃんとプロセスが終了するまで待機するようになりました。
とりあえずこの処理にて運用してみます。
これは私の我侭ですがサーバマシンにはあまり入れたくなかったので
別のアプローチ法も考えています。

お礼日時:2008/02/05 14:32

ボタンを2つ並べて、順に実行するのはどうでしょう。



BatchLauncherjava
---------------------------------------------------------------

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class BatchLauncher extends JFrame {
String path = "BATCHファイル名";//   ここを変更!

private static final long serialVersionUID = 1L;

public BatchLauncher() {
setTitle("BatchLauncher");
setSize(200, 120);

this.setDefaultCloseOperation(EXIT_ON_CLOSE);

this.getContentPane().setLayout(new FlowLayout());

JButton execBAT = new JButton("BATの実行");
execBAT.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onclick();
}
});
this.getContentPane().add(execBAT);
JButton execHello = new JButton("Helloの実行");
execHello.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onclickHello();
}
});
this.getContentPane().add(execHello);
setVisible(true);
}
public BatchLauncher(String path) {
this();
this.path=path;
}

public void onclick() {
ProcessBuilder builder = new ProcessBuilder(path);
try {
Process process = builder.start();
} catch (IOException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(this.getContentPane(), "プロセス ERROR");
}
}

public void onclickHello() {
System.out.println("HELLO");
}

public static void main(String args[]) {

new BatchLauncher();
}
}
---------------------------------------------------------------
    • good
    • 0

>通常のwindowを開くとはcmd.exeのことでしょうか?



コマンドプロンプト以外のwindowということです。

たぶん SWTのGUIで、Program.launch(...)というのがあったと思います。

残念ながら、これでcmd.exeが起動できるか確認していません。

現在時間がなくて申し訳ありませんが、確認しだいお知らせします。
    • good
    • 0

pr = runtime.exec("cmd.exe /c start "+BatchName);


のstartをつけると、すぐ処理が抜けてしまいそうな気がするのですが
どうでしょうか?

pr = runtime.exec("cmd.exe /c "+BatchName);

としてみてはどうでしょうか?

この回答への補足

回答ありがとうございます。

ご指摘の通りやってみたのですが、runtime.execから反応が返ってこなくなります。
startをつけることで起動させることができます。

補足日時:2008/02/01 13:45
    • good
    • 0

JAVADOC(Process)に、


-------------------------------------------------------------------------------------
 プロセスを作成するこれらのメソッドは、特定のネイティブなプラットフォーム上の特殊な
 プロセスではうまく動作しない場合があります。たとえば、... Microsoft Windows 環境で
 の Win16/DOS プロセス、...
-------------------------------------------------------------------------------------
とあります。これが原因とは考えられないでしょうか。

とりあえず今思いつく方法としては、
1.まず通常のwindowを開く。
2.そこから、バッチ処理を起動する。
3.バッチ処理終了後、windowを閉じる。

では、どうでしょうか。
通常のwindowならば今の方法waitFor()で、うまくいくと思います。

老婆心ながら、提示されたソースにはエラーが多いようです。

----------------------------- たか

この回答への補足

回答ありがとうございます。
windowを開くとはcmd.exeのことでしょうか?
そうだとして、既に開いたcmdに対してどうコマンドを転送すればよいのか…

エラーが多いのは掲載するにあたり、変数名などを縮めたのですが
それが全部でなかったとかだと思います。

補足日時:2008/02/01 13:42
    • good
    • 0

ふつうはwaitFor()をそのために使いますが、なにか使えない(役に立たない)状況はありますか?

この回答への補足

ご回答ありがとうございます。
A.bat-----------
sqlplus -s ABC/ABC@DEF@C:\SQL.Command
exit
----------------
SQL.Command-----
set echo off
set heading off
set feedback off
set verify off
set linesize 1000
set pagesize 0
set trimspool on
spool c:\Test.csv
select COL1||','||COL2 from TEMP_CSV_DATA
/
spool off
exit
-----------
以上のようにbatファイルからsqlplusのコマンドファイルを呼び出しています。
ためしにruntimeのほうで直接A.batの内容を実行したのですが
結果は同じでした。

補足日時:2008/01/31 12:03
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報