
//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側でフックするとは思うのですが、具体的にどう組めばいいのかが分かりません。
No.5ベストアンサー
- 回答日時:
残念ながら、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のおかげで
止まっていると思います。
-----------------------
たか
auty様
返事送れて申し訳ございません
ご回答ありがとうございました。
確かにちゃんとプロセスが終了するまで待機するようになりました。
とりあえずこの処理にて運用してみます。
これは私の我侭ですがサーバマシンにはあまり入れたくなかったので
別のアプローチ法も考えています。
No.6
- 回答日時:
ボタンを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();
}
}
---------------------------------------------------------------
No.4
- 回答日時:
>通常のwindowを開くとはcmd.exeのことでしょうか?
コマンドプロンプト以外のwindowということです。
たぶん SWTのGUIで、Program.launch(...)というのがあったと思います。
残念ながら、これでcmd.exeが起動できるか確認していません。
現在時間がなくて申し訳ありませんが、確認しだいお知らせします。
No.2
- 回答日時:
JAVADOC(Process)に、
-------------------------------------------------------------------------------------
プロセスを作成するこれらのメソッドは、特定のネイティブなプラットフォーム上の特殊な
プロセスではうまく動作しない場合があります。たとえば、... Microsoft Windows 環境で
の Win16/DOS プロセス、...
-------------------------------------------------------------------------------------
とあります。これが原因とは考えられないでしょうか。
とりあえず今思いつく方法としては、
1.まず通常のwindowを開く。
2.そこから、バッチ処理を起動する。
3.バッチ処理終了後、windowを閉じる。
では、どうでしょうか。
通常のwindowならば今の方法waitFor()で、うまくいくと思います。
老婆心ながら、提示されたソースにはエラーが多いようです。
----------------------------- たか
この回答への補足
回答ありがとうございます。
windowを開くとはcmd.exeのことでしょうか?
そうだとして、既に開いたcmdに対してどうコマンドを転送すればよいのか…
エラーが多いのは掲載するにあたり、変数名などを縮めたのですが
それが全部でなかったとかだと思います。
No.1
- 回答日時:
ふつうは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の内容を実行したのですが
結果は同じでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- UNIX・Linux gawk 3 2022/08/18 14:07
- Microsoft ASP C#からvbsを実行したい 5 2022/11/24 17:31
- 英語 In consideration of the multifaceted cascade of bo 4 2023/01/09 21:28
- 英語 提示文の"part of"のニュアンスについて 4 2022/08/20 15:00
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
GOF本のStrategyのJava版での質...
-
Androidでこのエラーを解決した...
-
負の数を取得するには?
-
javaの同期について
-
フェードアウト時にぶちっと画...
-
getConnection( )メソッドの戻り値
-
staticな有効範囲の配列の作り...
-
C#で、定数をフラグ(if文)に...
-
java setterとgetterについて
-
Windowsのリソース作成について
-
アプレットでマウスイベントが...
-
多角形を動かす範囲を設定した...
-
JWindow、JFrameでモーダル化の...
-
Jpanelへの描画について(初心者...
-
JComboBoxをsetEnabled以外でロ...
-
以下のコードのどこが問題なの...
-
内部クラスにする方法教えてく...
-
プログラムミス?
-
C#クラスについて教えてください
-
actionListenerについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
ボタンの複数割り当てについて
-
C#で、あるクラスのメンバーす...
-
C#で別のFormへ複数の値を返そ...
-
C# WinForm のDataGridView Cel...
-
C# visibleプロパティをfalseに...
-
C# 矢印キーの取得
-
C# MouseHoverを何度も呼ぶには
-
Junitテストでvoid戻り値メッソ...
-
C#でのWNetAddConnection3の使...
-
C#でキーイベントが発生しない...
-
C# DataGridView列カスタマイズ
-
C#から、C++で作成したdll内の...
-
画像ファイル操作方法
-
エンターキーを押すとOKボタン...
-
スレッド動かず
-
Java コレクション・ジェネリク...
-
なぜエラーになるのかがわかり...
-
マウスクリックで別のスレッド...
-
参照されない
おすすめ情報