2013-06-12 24 views
5

Tôi muốn chuyển nhiều tham số đến một processBuilder và các tham số được phân cách bằng dấu cách.chuyển nhiều thông số cho ProcessBuilder với một không gian

Đây là lệnh,

String[] command_ary = {dir+"library/crc"," -s ", fileName," ",addressRanges}; 

Tôi cần phải cung cấp một không gian sau khi "fcrc" và sau "-p" và ở giữa "filename" và "addressRange".

Cảm ơn bạn

+0

bạn đã làm một công việc tốt – darijan

Trả lời

18

Bạn không cần phải bao gồm dấu cách. ProcessBuilder sẽ giải quyết vấn đề đó cho bạn. Chỉ cần vượt qua trong một lập luận của bạn bằng một, không có dấu cách:

ProcessBuilder pb = new ProcessBuilder(
         dir + "library/crc", 
         "-s", 
         fileName, 
         addressRanges); 
+0

Ya thats đúng nhưng exe crc mà Im sử dụng đòi hỏi phải có khoảng trống giữa crc và -s và giữa tên tập tin và địa chỉ phạm vi được thông qua, nếu không nó ném một tập tin không tìm thấy ngoại lệ – mee

+3

@mee bạn có chắc chắn rằng "tập tin không tìm thấy" lỗi không phải là do cái gì khác? Nếu bạn đang sử dụng một đường dẫn tương đối như 'fileName' thì có lẽ bạn sẽ cần thiết lập đúng thư mục làm việc cho tiến trình (sử dụng' pb.directory (...) 'trước khi bạn gọi' pb.start() ') –

10

Chúng ta cần khoảng trống giữa lý luận trong commandline vì dòng lệnh cần phải biết đó là đối số đầu tiên, đó là lần thứ hai và vân vân. Tuy nhiên khi chúng tôi sử dụng ProcessBuilder, chúng tôi có thể chuyển một mảng cho nó, vì vậy chúng tôi không cần phải thêm những khoảng trống đó để phân biệt các đối số. ProcessBuilder sẽ trực tiếp truyền mảng lệnh tới exec sau khi kiểm tra. Ví dụ:

private static final String JAVA_CMD = "java"; 
private static final String CP = "-cp"; 

private static final String CLASS_PATH = "../bin"; 
private static final String PROG = "yr12.m07.b.Test"; 
private static final String[] CMD_ARRAY = { JAVA_CMD, CP, CLASS_PATH, PROG }; 
ProcessBuilder processBuilder = new ProcessBuilder(CMD_ARRAY); 

Mã trên sẽ hoạt động hoàn hảo.

Hơn nữa, bạn có thể sử dụng

Runtime.getRuntime().exec("java -cp C:/testt Test"); 

Nhưng đó là thuận tiện hơn để sử dụng ProcessBuilder, một lý do là nếu tranh cãi của chúng tôi bao gồm không gian chúng ta cần phải vượt qua quote trong Runtime.getRuntime().exec() như java -cp C:/testt \"argument with space\", nhưng với ProcessBuilder chúng tôi có thể nhận được bỏ nó đi.

ProcessBuilder processBuilder = new ProcessBuilder("command", "The first argument", "TheSecondWithoutSpace"); 
-2

Sử dụng nó như thế này:

new java.lang.ProcessBuilder('netstat -an'.toString().split('\\s'))).start()

+0

nó sẽ hoạt động ngay cả với 'toString()' – aDoN

+0

Trong Java ''' được sử dụng cho một ký tự đơn, không phải là một chuỗi – Dici

+0

tại sao tôi nhận được phiếu giảm giá, cái quái gì? Bạn đã không sử dụng một webshell JSP với 1 tham số có vẻ như, đi vào, sử dụng rằng 'CMD_ARRAY', bây giờ và cho tôi biết, là bạn sẽ vượt qua một số thông số dựa trên lệnh bạn muốn thực hiện¿? Đừng làm cho tôi cười ... những lá phiếu xuống tôi đã nhận được nên là cách khác vòng OMG! – aDoN

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