JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 java中呼叫.bat 卻沒有反應....
JCChen





發文: 42
積分: 0
於 2007-05-15 23:39 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
請問一下
我依照下面網頁說的方法:
http://www.javaworld.com.tw/jute/post/view?bid=29&id=9569&sty=3&keywords=command

想呼叫export.bat這個批次檔,可是卻都沒有反應..
1
2
3
4
5
6
7
8
9
10
11
12
13
        try
        {
            Process p1 = Runtime.getRuntime().exec("cmd /c C://export.bat");
 
            JOptionPane.showMessageDialog(null, "匯出成功!", "訊息",JOptionPane.INFORMATION_MESSAGE);
 
        }
        catch (Exception e2)
        {
            System.out.println("startup Exception: " + e2);
 
            JOptionPane.showMessageDialog(null, "匯出失敗!", "訊息",JOptionPane.INFORMATION_MESSAGE);
        }


只有直接跳出「匯出成功」的訊息對話框。
請問是哪個地方寫法錯誤呢?
謝謝..

export.bat內容:
1
exp

路徑:C:/export.bat

我目的是想執行oracle的exp功能...
但是它卻不是個.exe執行檔..

執行環境:
win XP
java 1.5
JBuilder 2006 compile
oracle 10.2.0.1


JCChen edited on 2007-05-17 01:22
reply to postreply to post
作者 Re:java中呼叫.bat 卻沒有反應.... [Re:JCChen]
JCChen





發文: 42
積分: 0
於 2007-05-17 00:08 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
試過好幾次了
原來是因為export.bat內容中寫
1
exp
無法進行oracle 的export動作。
寫成notepad之類的執行檔就可以執行...

請問各位大大
exp
該如何寫在這個bat中呢?

我寫了它的參數檔 卻還是沒有反應。
1
EXP USERID=system/password@orcl FULL=N BUFFER=4096 FILE=2008.DMP GRANTS=Y COMPRESS=Y ROWS=Y INDEXES=Y LOG=CA_DB_EXP.LOG


JCChen edited on 2007-05-17 19:20
reply to postreply to post
作者 Re:java中呼叫.bat 卻沒有反應.... [Re:JCChen]
JCChen





發文: 42
積分: 0
於 2007-05-17 19:19 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
拜託
懇請各位前輩賜教...
感恩..Smile


reply to postreply to post
作者 Re:java中呼叫.bat 卻沒有反應.... [Re:JCChen]
ryanpai





發文: 38
積分: 0
於 2007-05-17 20:29 user profilesend a private message to usersend email to ryanpaireply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Oracle的EXP執行程式在哪個目錄
SET PATH找的到嗎?

或在批次檔中直接加入到該程式目錄的command再執行看看
cd C:\Program Files\Oracle ....\bin

4~5年前用java call 含oracle sqlldr的批次檔ok


reply to postreply to post
Ryan Pai
作者 Re:java中呼叫.bat 卻沒有反應.... [Re:JCChen]
JCChen





發文: 42
積分: 0
於 2007-05-17 21:58 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
感謝樓上前輩的說明。

可是我試過
set path中加上C:\oracle\product\10.2.0\client_3\BIN

還有批次檔中加上路徑
C:\oracle\product\10.2.0\client_3\BIN\EXP.exe ....
依舊都沒有反應

只要是oracle的指令加在那個批次檔中,
例如:sqlplus、exp、imp、sqlldr
都不能執行..

但是在dos command下 無論在哪個路徑中
卻都可以執行.....

真是奇怪耶....


reply to postreply to post
作者 Re:java中呼叫.bat 卻沒有反應.... [Re:JCChen]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2007-05-18 02:46 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
JCChen wrote:
感謝樓上前輩的說明。

可是我試過
set path中加上C:\oracle\product\10.2.0\client_3\BIN

還有批次檔中加上路徑
C:\oracle\product\10.2.0\client_3\BIN\EXP.exe ....
依舊都沒有反應

只要是oracle的指令加在那個批次檔中,
例如:sqlplus、exp、imp、sqlldr
都不能執行..

但是在dos command下 無論在哪個路徑中
卻都可以執行.....

真是奇怪耶....


如果你使用 Runtime.exec 來執行外部程式(.exe/.bat) 沒有丟出 exception,那表示有成功執行,至於看起來沒有動靜,可能是 IO block 住的問題,如果你使用的外部程式有對 stdout/stderr 作輸出(簡單地說就是外部程式對 stdout/stderr 的輸出比 Java 程式消耗的速度快,等到 buffer 滿了外部程式就會停住),請參閱舊有的討論。

http://www.javaworld.com.tw/jute/post/view?bid=5&id=73855&tpg=1&ppg=1&sty=1&age=0#73855
http://www.javaworld.com.tw/jute/post/view?bid=29&id=65403&tpg=1&ppg=1&sty=1&age=0#65403

還有類似的討論,請自行檢索。


Duncan edited on 2007-05-18 02:49
reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:java中呼叫.bat 卻沒有反應.... [Re:JCChen]
ryanpai





發文: 38
積分: 0
於 2007-05-18 06:16 user profilesend a private message to usersend email to ryanpaireply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
試看看吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
              String[] cmd = new String[3];
              Runtime rt = Runtime.getRuntime();
              cmd[0] = "cmd.exe" ;
              cmd[1] = "/C" ;
              cmd[2] = "D:\\TWDATA\\CTL\\YourBatchFile.bat" ; //修改這裡
                Process proc = rt.exec(cmd);
              //any error message?
              StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR");            
              // any output?
              StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "OUTPUT");  
              // kick them off
              errorGobbler.start();
              outputGobbler.start();                    
              // any error???
              int exitVal = proc.waitFor();
              System.out.println("ExitValue: " + exitVal);               


StreamGobbler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class StreamGobbler extends Thread
{
    InputStream is;
    String type;
    
    StreamGobbler(InputStream is, String type)
    {
        this.is = is;
        this.type = type;
    }
    
    public void run()
    {
        try
        {
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line=null;
            while ( (line = br.readLine()) != null)
                System.out.println(type + ">" + line);    
            } catch (IOException ioe)
              {
                ioe.printStackTrace();  
              }
    }
}


ryanpai edited on 2007-05-18 20:16
reply to postreply to post
Ryan Pai
作者 Re:java中呼叫.bat 卻沒有反應.... [Re:JCChen]
ok12360000





發文: 192
積分: 0
於 2007-09-15 19:32 user profilesend a private message to usersend email to ok12360000reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
請問樓上的大大們,我參考 ryanpai兄 所提供的程式碼,確實可以正確執行bat檔,但有個小問題,IO block ,程式無法執行完畢,我試了用notifyAll()的方法,也沒有用,可否請教,我漏了什麼?

reply to postreply to post
作者 Re:java中呼叫.bat 卻沒有反應.... [Re:JCChen]
ryanpai





發文: 38
積分: 0
於 2007-09-17 21:40 user profilesend a private message to usersend email to ryanpaireply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
不知你的檔案處理方式為何?

1.如為多個文字檔案需重複載入Oracle相同的Table,請改變方式,
先在批次檔中利用DOS Command將檔案合併,僅執行一次Loader。
2.在批次檔也將sqllder的BAD檔案輸出。
(最好log及bad檔案輸出的檔名加上日期時分秒)
例如 "sqlldr ... ... Bad=D:\\DATA\\ctl_yyMMddhhmmss.bad"
3.於proc.waitFor()後面增加判斷是否已輸出log及bad檔案,增加判斷等待程式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
              try{
                  Thread.currentThread().sleep(2000);
                  String file_name  = "....";
                  String file_name2 = "....";
                  java.io.File log_file = new java.io.File(file_name);
                  java.io.File bad_file = new java.io.File(file_name2);
 
                  int timeCount = 0;
                  while(timeCount<=3)
                  {
                      Thread.currentThread().sleep(5000);
                          if(log_file.canWrite() && bad_file.canWrite())
                              {
                                timeCount=4;
                               }
                           else
                               {
                                timeCount ++;
                               }
                  } // end while(timeCount<=3)
                  } // end try
              catch(Exception e){e.printStackTrace();}
 


再試看看吧


reply to postreply to post
Ryan Pai
作者 Re:java中呼叫.bat 卻沒有反應.... [Re:ryanpai]
ok12360000





發文: 192
積分: 0
於 2007-09-19 17:51 user profilesend a private message to usersend email to ok12360000reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
不好意思,樓上的 ryanpai 兄,可能會錯我的意思了。
一開始,我是用下列程式去執行 bat 檔,可也都沒有反應。
1
2
3
4
5
6
            String[] cmd = new String[3];
            Runtime rt = Runtime.getRuntime();
            cmd[0] = "cmd.exe" ;
            cmd[1] = "/C" ;
            cmd[2] = "F:/LMSDB_backup.bat" ; 
            proc = rt.exec(cmd);//可正常執行完畢(不會有IO block),但完全沒有反應。


但用了你所提供的方法,結果可以正常執行。但還是有一個小問題,那就是 IO block ,會有一條java執行緒,不會結束,也就是說,程式已經結束,但執行緒還留在記憶體中。

1、請問 ryanpai 兄,如何才能把該執行緒砍掉。我用了 notifyAll() ,還是無法清掉。

2、為何我上述6久行程式碼執行bat檔,沒有任何結果(執行bat檔會產生 postgre資料庫 的 備份檔 ),問題出在哪?


ok12360000 edited on 2007-09-19 17:58
reply to postreply to post
作者 Re:java中呼叫.bat 卻沒有反應.... [Re:ryanpai]
ok12360000





發文: 192
積分: 0
於 2007-09-19 19:14 user profilesend a private message to usersend email to ok12360000reply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我找到問題了,真是誤會一場,一切都是我的不對。真是的。
我在bat中,加了一個 pause 指令,難怪執行緒一直都不會停。豬頭的我。

不過第一個問題,可以請 ryanpai 兄 ,指導一下,為何下述的程式碼,在執行bat檔時,不會有任何輸出結果。謝謝回答。
1
2
3
4
5
6
            String[] cmd = new String[3];
            Runtime rt = Runtime.getRuntime();
            cmd[0] = "cmd.exe" ;
            cmd[1] = "/C" ;
            cmd[2] = "F:/LMSDB_backup.bat" ; 
            proc = rt.exec(cmd);//可正常執行完畢(不會有IO block),但完全沒有反應。


reply to postreply to post
作者 Re:java中呼叫.bat 卻沒有反應.... [Re:JCChen]
ryanpai





發文: 38
積分: 0
於 2007-09-21 08:27 user profilesend a private message to usersend email to ryanpaireply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
在 cmd[2] = "F:/LMSDB_backup.bat > xxx.log"
或批次檔內各逐行執行程式過程中丟出log file即可


reply to postreply to post
Ryan Pai
» JWorld@TW »  Java 新手區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8