2011-06-22 28 views
6

Trong chương trình Java của tôi, tôi tạo ra một quá trình thực thi một lệnh để chạy một tập tin thực thi như thế này:Thực thi một lệnh từ Java và Waiting for the Command để thúc

try { 
     File tempFile = new File("C:/Users/Public/temp.cmd"); 
     tempFile.createNewFile(); 
     tempFile.deleteOnExit(); 


     setContents(tempFile, recipe.getText()); //Writes some user input to file 
     String cmd = "cmd /c start " + tempFile.getPath(); 


     Process p = Runtime.getRuntime().exec(cmd); 


     int exitVal = p.waitFor(); 

     refreshActionPerformed(evt); 

    } catch (InterruptedException ex) { 
     Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IOException ex) { 
     Logger.getLogger(mainFrame.class.getName()).log(Level.SEVERE, null, ex); 
    } 

Bây giờ, những gì tôi muốn đã xảy ra là lệnh

refreshActionPerformed(evt); 

chỉ chạy sau tập tin thực thi mà tôi gọi đã thực hiện xong. Nhưng ngay bây giờ, nó chạy ngay sau khi Command Prompt mở ra.

Làm cách nào để khắc phục sự cố này?

+0

Hãy chắc chắn đọc và thực hiện * tất cả * lời khuyên của [Khi Runtime.exec() sẽ không] (http://www.javaworld.com/javaworld/jw-12-2000/jw- 1229-traps.html). Nếu không, bạn gần như chắc chắn sẽ trải nghiệm "sẽ không". Ngoài ra, hãy xem xét sử dụng 'ProcessBuilder' cho 1,5+ và chuyển các đối số dưới dạng mảng. –

+0

Tôi đọc Khi Runtime.exec() sẽ không, nhưng thẳng thắn, tôi hoàn toàn mới với lập trình Java và tôi không có ý tưởng làm thế nào để thực hiện lời khuyên của bài viết đó. –

Trả lời

12

Tôi đã tìm kiếm câu trả lời ở nơi khác. Để giữ cho quy trình ban đầu mở cho đến khi tệp hàng loạt hoàn thành tất cả những gì bạn cần là "/ wait"

Process p = Runtime.getRuntime().exec("cmd /C start /wait filepath.bat"); 
int exitVal = p.waitFor(); 
+2

Đối với tôi '/ wait' và 'p.waitFor()' đã hoạt động. –

2

gọi "cmd/c start" khiến cmd kích hoạt một phiên bản khác và thoát ngay lập tức. Hãy thử dùng lệnh "start".

+0

Khi tôi làm điều này, chương trình của tôi bị đóng băng. Tôi đoán là p.waitfor() hiện không quay trở lại. Tôi nên làm gì? –

+0

có thể đặt "lối ra" ở cuối tệp .bat của bạn? –

+0

Điều đó dường như hoạt động. Nhưng vấn đề của tôi là nội dung của tệp .bat được người dùng xác định. Vì vậy, nếu họ không đặt EXIT ở cuối, họ sẽ hơi say. Lời khuyên nào? –

0

Câu trả lời được đưa ra là chính xác. Tôi đã thêm rằng cửa sổ được mở bằng mã cần được đóng thủ công.

Process p = Runtime.getRuntime().exec("cmd /C start /wait filepath.bat"); 
int exitVal = p.waitFor(); 
Các vấn đề liên quan