2012-02-08 23 views
6

Tôi đang làm việc trên một chương trình Java phải lấy số sê-ri máy, số sê-ri CPU vv. Trên Windows, giao diện WMI là cách tốt nhất để truy vấn thông tin như vậy, và cách tiêu chuẩn để truy vấn bằng cách sử dụng dòng lệnh làQuá trình bên ngoài được khởi chạy với ProcessBuilder/Runtime.exec() thất bại trên XP, hoạt động trên Win 7

wmic bios get serialnumber 

trong đó sản xuất ra:

SerialNumber 
WWV46RT609A3467173E 

dịch này vào Java, tôi đã sử dụng cả hai Runtime.exec () và một ProcessBuilder như sau: (Các Proces nhận xét s p là những gì tôi đã làm trước đó). Ở đây, thành phần và mục tương ứng với 'bios' và 'serialnumber' trong dòng lệnh ở trên.

String ret = ""; 
    ProcessBuilder pb = new ProcessBuilder("wmic", component, "get", item); 
    pb.redirectErrorStream(true); 
    // Process p = Runtime.getRuntime().exec(
    // "wmic " + component + " get " + item); 
    Process p = pb.start(); 
    InputStreamReader isr = new InputStreamReader(p.getInputStream()); 
    BufferedReader input = new BufferedReader(isr); 
    String str; 
    while ((str = input.readLine()) != null) { 
     if (str.equalsIgnoreCase(item) || StringUtils.isBlank(str)) { 
      continue; 
     } 
     ret = str.trim(); 
    } 
    input.close(); 
    isr.close(); 
    System.out.println(ret); 

Đoạn mã này hoạt động hoàn hảo trên Windows 7, nhưng bị treo trên Windows XP. Sử dụng wmic từ dòng lệnh hoạt động trên cả hai hệ điều hành. Tôi đọc here rằng có sự cố khi xử lý cả stdout và stderr của quá trình được gọi, do đó cuộc gọi redirectErrorStream().

Tại sao nó hoạt động hoàn hảo trên Windows 7 nhưng thất bại trên XP? Có cách nào khác ngoài việc sinh ra một sợi riêng biệt, hay còn gọi là 'StreamGobbler'? (Ví dụ liên kết là khá cổ xưa, và xảy ra trước lớp ProcessBuilder, với redirectErrorStream() gọi của nó.

+0

luôn có một ngăn xếp (ví dụ như jstack) khi quá trình "treo". trên một lưu ý lật: bạn cần 'break' sau' ret = str.trim() ', nhưng tôi đoán là trên XP lệnh chỉ nhập vào chế độ tương tác – bestsss

+0

+1 để đăng câu hỏi mà nhận xét 1 rõ ràng nhất có thể * được 'Đọc bài viết JavaWorld', và cho thấy bằng chứng đã đọc nó. :) –

+0

@Andrew: Cảm ơn :) Tôi thường đăng câu hỏi chỉ khi tôi hoàn toàn không có lựa chọn, (có vung cổ của Google về chủ đề) hoặc điều tôi đang làm là một chút mơ hồ hoặc không được ghi lại tài liệu (giống như tất cả những cái gần đây của tôi trên NSIS) – Rex

Trả lời

0

Bạn phải sử dụng đề để nắm bắt ouputs (tiêu chuẩn lỗi &).

Bạn cũng có thể có một cái nhìn tại Apache library

5

Tôi hy vọng rằng hiện tại bạn đã có giải pháp cho vấn đề này.Nếu không, đây là những gì bạn cần làm. Trước tiên, tôi cũng gặp phải vấn đề tương tự và phát hiện ra rằng đó là vấn đề về bufferedReader Nó được đưa vào tình trạng bế tắc khiến cho cửa sổ xp treo. Giải pháp là mô phỏng phần cuối của dòng (eof) đến bộ đệm bằng cách gắn thêm "<NUL" lệnh.

String[] command = {"CMD", "/C", "WMIC COMPUTERSYSTEM GET USERNAME <NUL "} and executing this command. 
+0

+1. Câu trả lời này đã giúp cộng đồng Minecraft rất nhiều! Rất nhiều công cụ Minecraft phải chạy các ứng dụng khác và chúng chạy vào cùng một vấn đề chính xác trên Windows XP. – Cybis

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