2009-03-30 21 views
9

Trên OS X, tôi đang cố gắng .exec một cái gì đó, nhưng khi đường dẫn chứa khoảng trắng, nó không hoạt động. Tôi đã thử xung quanh đường dẫn với dấu ngoặc kép, thoát khỏi không gian và thậm chí sử dụng \ u0020.Không gian trong đường dẫn thực thi java cho OS X

Ví dụ, công trình này:

Runtime.getRuntime().exec("open /foldername/toast.sh"); 

Nhưng nếu có một không gian, không ai trong số những công việc:

Runtime.getRuntime().exec("open /folder name/toast.sh"); 

Runtime.getRuntime().exec("open \"/folder name/toast.sh\""); 

Runtime.getRuntime().exec("open /folder\\ name/toast.sh"); 

Runtime.getRuntime().exec("open /folder\u0020name/toast.sh"); 

Ý tưởng?

Chỉnh sửa: Dấu gạch chéo ngược đã thoát ... vẫn không hoạt động.

Trả lời

11

Có một bản tóm tắt các vấn đề này trên Sun's forums ... dường như là một vấn đề khá phổ biến không chỉ bó hẹp OS X.

Các bài mới nhất trong chủ đề tóm tắt các giải pháp được đề xuất. Về bản chất, sử dụng hình thức Runtime.exec mà phải mất một mảng String[]:

String[] args = new String[] { "open", "\"/folder name/toast.sh\"" }; 

hoặc (diễn đàn cho thấy điều này sẽ làm việc quá)

String[] args = new String[] { "open", "folder name/toast.sh" }; 
+0

Cảm ơn! FYI Tôi đã có một vài lá cờ phụ trong chương trình thực và nếu bạn sử dụng một mảng như thế này, thì bạn phải phá vỡ tất cả mọi thứ. Ví dụ: Chuỗi [] args = new String [] {"mở", "-n", "tên thư mục/toast.sh"}; – Alan

+0

Liên kết chết ngay bây giờ: (có ai biết tôi có thể tìm thấy liên kết thay thế ở đâu không? – Joe

1

Hãy thử điều này:

Runtime.getRuntime().exec("open /folder\\ name/toast.sh"); 

"\" sẽ chỉ đặt một không gian trong chuỗi, nhưng "\" sẽ đặt một "\" trong chuỗi, mà sẽ được chuyển đến vỏ, và vỏ sẽ thoát khỏi không gian.

Nếu điều đó không hiệu quả, hãy chuyển các đối số dưới dạng mảng, một phần tử cho mỗi đối số. Bằng cách đó, vỏ không dính líu vào và bạn không cần phải trốn thoát kỳ quái.

Runtime.getRuntime().exec(new String[]{"open", "/folder name/toast.sh"}); 
+0

oops, đó là một lỗi đánh máy trên một phần của tôi, tôi đã cố gắng và điều này không hoạt động. – Alan

0

tùy chọn Paul của công trình, nhưng bạn vẫn phải thoát khỏi không gian như như vậy:

Runtime.getRuntime().exec(new String[]{"open", "/folder\\ name/toast.sh"}); 

Điều hút về việc sử dụng mảng String là mỗi thông số và tùy chọn của nó phải nằm trong phần tử riêng của chúng. Ví dụ bạn không thể làm điều này:

Runtime.getRuntime().exec(new String[]{"executable", "-r -x 1", "/folder\\ name/somefile"}); 

Nhưng thay vì phải xác định nó như vậy:

Runtime.getRuntime().exec(new String[]{"executable", "-r", "-x", "1", "/folder\\ name/somefile"}); 
Các vấn đề liên quan