//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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
StrutsのiterateタグでListに格...
-
C# WinForm のDataGridView Cel...
-
C#で、あるクラスのメンバーす...
-
Processingでマウスクリックで...
-
Junitテストでvoid戻り値メッソ...
-
LVM_SETITEMSTATEでListViewの...
-
決められて時間が経過するとア...
-
Thread.sleepのInterruptedExce...
-
C#で別のFormへ複数の値を返そ...
-
java アプリケーションをjava ...
-
Runtime#proccessのwait
-
C# DataGridView列カスタマイズ
-
C# visibleプロパティをfalseに...
-
javaアプレット repaintのタイ...
-
C#でキーイベントが発生しない...
-
C# MouseHoverを何度も呼ぶには
-
MouseEventのつけ方
-
JScrollPaneで、表示がおかしく...
-
変数を動的に利用するには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
大量のデータを読み込んで表示...
-
C#で、あるクラスのメンバーす...
-
Junitテストでvoid戻り値メッソ...
-
C#でのWNetAddConnection3の使...
-
C# 矢印キーの取得
-
ボタンの複数割り当てについて
-
C# DataGridView列カスタマイズ
-
コンボボックスを使う時の警告
-
ユーザーコントロールを動的に...
-
アプレットでマウスイベントが...
-
C#で別のFormへ複数の値を返そ...
-
LVM_SETITEMSTATEでListViewの...
-
C#,listBoxのItem追加について...
-
C# MouseHoverを何度も呼ぶには
-
C# visibleプロパティをfalseに...
-
C# 親フォームで指定した値を...
-
C# 半角カナの文字化けについて
-
決められて時間が経過するとア...
-
javaを用いて,a列,b列の空白...
-
Processingでマウスクリックで...
おすすめ情報