2010-01-27 39 views
14

Tôi đang gặp khó khăn khi thực hiện một tệp lô trong Java mà hy vọng các tham số. Các tham số này có thể chứa các khoảng trắng vì vậy tôi cần bọc chúng trong dấu ngoặc kép. Tôi cũng sẽ cần phải làm điều tương tự cho Linux vì một số tham số có thể chứa các ký tự đặc biệt như !. mã WindowsThực hiện với các tham số

phi chức năng:

ProcessBuilder pb = new ProcessBuilder(
     "cmd", 
     "/c", 
     "\"mybat.bat\"", 
     "\"param 1\"", 
     "\"param 2\"", 
     "\"param 3\"" 
     );  

phi chức năng mã Linux:

ProcessBuilder pb = new ProcessBuilder(
     "bash", 
     "-c", 
     "'myshellscript.sh'", 
     "'param 1'", 
     "'param 2'", 
     "'param 3'" 
     ); 

Tôi hiểu rằng tôi nên có thêm các thông số như ví dụ của Windows dưới đây, nhưng điều này sẽ không làm việc với các không gian:

ProcessBuilder pb = new ProcessBuilder(
     "cmd", 
     "/c", 
     "mybat.bat param 1 param 2 param 3" 
     ); 

Điều này nên được thực hiện như thế nào?

+0

Không bạn đặt chúng trong dấu ngoặc kép cho rằng lý do chính xác? Tại sao bạn không làm điều đó cho đoạn trích cuối cùng của mình? – zneak

+0

Tôi đang cố gắng làm cho hai đoạn đầu tiên hoạt động. Đoạn thứ ba sẽ chuyển 6 tham số tới mybat.bat khi tôi chỉ tìm ba thông số. –

Trả lời

17

Windows:

ProcessBuilder pb = new ProcessBuilder(
     "cmd", "/c", "mybat.bat", 
     "param 1", "param 2", "param 3"); 

Unix:

ProcessBuilder pb = new ProcessBuilder(
     "sh", "mybat.sh", 
     "param 1", "param 2", "param 3"); 
+0

Tôi đã thử điều này, nó hoạt động !!! –

+1

Tại sao sự rung động này? java.io.IOException: java.io.IOException: sh: không tìm thấy tại java.lang.UNIXProcess. (UNIXProcess.java:148) tại java.lang.ProcessImpl.start (ProcessImpl.java:65) tại java.lang.ProcessBuilder.start (ProcessBuilder.java:451) tại DmMdbConsumer.migrateData (DmMdbConsumer.java:328) tại DmMdbConsumer.run (DmMdbConsumer.java:230) tại java.lang.Thread.run (Chủ đề.java: 595) –

+0

"sh" phải là "/ bin/sh" trong trường hợp của tôi. Cảm ơn! –

5

Không, bạn nên không báo giá args trên * nix. Việc trích dẫn là cần thiết đối với * nix trong một trình bao tương tác để ngăn chặn trình bao giải thích sai chúng, nhưng khi khởi chạy một tiến trình trực tiếp một trình bao không liên quan. Do đó không cần phải báo giá.

Nếu bạn đưa dấu ngoặc kép vào, quá trình khởi chạy sẽ xem chúng như là một phần của các đối số đến và làm những việc như (ví dụ) thử mở tên tệp chứa dấu ngoặc kép.

Bạn cũng không muốn đối số "-c" bị bash. Điều đó nói với nó để phân tích đối số tiếp theo như là một dòng lệnh, nhưng bạn đang cung cấp một danh sách các đối số. Loại bỏ tùy chọn "-c" và dấu ngoặc thừa và nó sẽ hoạt động.

Cuộc gọi Linux thích hợp sẽ là:

ProcessBuilder pb = new ProcessBuilder(
    "bash", 
    "myshellscript.sh", 
    "param 1", 
    "param 2", 
    "param 3" 
    ); 

Cũng không rằng nếu tập tin "myshellscript.sh" là thực thi và có dòng công việc thích hợp (ví dụ: "#/bin/bash!"), Bạn không cần đối số "bash". Điều này là thích hợp hơn bởi vì nếu kịch bản được thay thế bằng một chữ viết bằng một ngôn ngữ khác, bạn sẽ không phải cập nhật ứng dụng gọi điện của bạn.

Tương tự như vậy, trên Windows, bạn không cần các đối số "cmd" và "/ c". Trình khởi chạy/hệ điều hành sẽ xử lý việc khởi chạy tệp lô (dựa trên tiện ích mở rộng) tự động.

+0

Thật không may tôi cần cmd và/c cho các cửa sổ. Kịch bản shell của tôi không có dòng shebang, nhưng tôi không thể làm cho nó hoạt động với hoặc không có sh. –

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