2013-06-12 38 views
6

Tôi đang cố gắng chạy tệp .bat và nhận kết quả đầu ra. Tôi có thể chạy nó nhưng tôi không thể nhận được kết quả bằng Java:Lấy đầu ra từ tệp BAT bằng cách sử dụng Java

String cmd = "cmd /c start C:\\workspace\\temp.bat"; 

Runtime r = Runtime.getRuntime(); 
Process pr = r.exec(cmd); 

BufferedReader stdInput = new BufferedReader(
    new InputStreamReader(pr.getInputStream())); 

String s ; 
while ((s = stdInput.readLine()) != null) { 
    System.out.println(s); 
} 

Kết quả là null. Không có ý tưởng tại sao tôi nhận được điều này. Lưu ý rằng tôi đang sử dụng Windows 7.

+0

Đọc (và triển khai) * tất cả * đề xuất của [Khi Runtime.exec() sẽ không] (http://www.javaworld.com/jw-12-2000/jw-1229-traps.html) . Điều đó có thể giải quyết vấn đề. Nếu không, nó sẽ cung cấp thêm thông tin vì lý do nó không thành công. Sau đó bỏ qua nó đề cập đến 'exec' và xây dựng' Process' bằng cách sử dụng một 'ProcessBuilder'. Ngoài ra, ngắt chuỗi 'String arg' thành' String [] args' để tính các đối số có chứa dấu cách. –

Trả lời

4

Sử dụng "cmd/c bắt đầu [...] "để chạy một tập tin thực thi sẽ tạo ra một tiến trình con thay vì chạy tập tin thực thi của bạn trực tiếp.

Vì vậy, bạn sẽ không có quyền truy cập vào đầu ra của nó. Để hoạt động, bạn nên sử dụng:

String cmd = "C:\\workspace\\temp.bat"; 

Nó hoạt động trong Windows XP.

+0

này giải quyết nó tôi đã một vấn đề khác mà file dơi chứa bắt đầu run.bat lệnh và tôi cần những kết quả khác quá :( – Muath

+1

Bạn có thể sử dụng ** CALL ** để chạy một file batch khác bên chính của bạn Xem [link] (http://www.robvanderwoude.com/call.php) và [link] (http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en- chúng tôi/call.mspx? mfr = true) để tham khảo. –

3

Bạn cần bắt đầu một chuỗi mới có thể đọc luồng đầu ra của thiết bị đầu cuối và sao chép nó vào bảng điều khiển, sau khi bạn gọi process.waitFor().

làm cái gì đó như:

String line; 
Process p = Runtime.getRuntime().exec(...); 
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
while ((line = input.readLine()) != null) { 
    System.out.println(line); 
} 
input.close(); 

cách tiếp cận tốt hơn sẽ sử dụng lớp ProcessBuilder, và cố gắng viết một cái gì đó như:

ProcessBuilder builder = new ProcessBuilder("/bin/bash"); 
builder.redirectInput(); 
Process process = builder.start(); 

while ((line = reader.readLine()) != null) { 
    System.out.println ("Stdout: " + line); 
} 
+0

dude tôi đã cố gắng này đã không làm việc Tôi nhận được giá trị null thay vì kết quả lệnh – Muath

+0

trong ProcessBuilder không có .redirectInput(); phương pháp bất kỳ đề xuất nào? tôi sử dụng NetBeans BTW – Muath

-1
BufferedReader stdInput = new BufferedReader(new 
InputStreamReader(pr.getErrorStream())); 

thay vì sử dụng

BufferedReader stdInput = new BufferedReader(new 
InputStreamReader(pr.getInputStream)); 
+0

Đừng bỏ qua luồng lỗi. Đối với mã mạnh mẽ, cả hai đều phải được tiêu thụ. –

+0

cho cả hai vòng lặp trong khi yêu cầu riêng biệt –

+0

Điều này không thực sự trả lời câu hỏi. –

Các vấn đề liên quan