2009-03-30 12 views
9

Na OS X, próbuję .exec coś, ale gdy ścieżka zawiera spację, to nie działa. Próbowałem otoczyć ścieżkę cytatami, uciekając z przestrzeni, a nawet używając \ u0020.Spacje w java wykonać ścieżkę dla OS X

Na przykład to działa:

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

Ale jeśli nie ma miejsca żadna z tych prac:

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"); 

pomysły?

Edytuj: Escaped backslash ... nadal nie działa.

Odpowiedz

11

Jest to podsumowanie tego problemu na Sun's forums ... wydaje się być dość powszechny problem nie ogranicza się do OS X.

ostatni post w wątku podsumowuje proponowanego rozwiązania. W istocie, należy użyć formy Runtime.exec że trwa String[] tablicy:

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

lub (forum sugeruje to będzie działać zbyt)

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

Dzięki! FYI Miałem kilka dodatkowych flag w prawdziwym programie i jeśli użyjesz takiej tablicy, musisz wszystko zepsuć. Przykład: Ciąg [] args = nowy ciąg [] {"otwórz", "-n", "nazwa folderu/toast.sh"}; – Alan

+0

Dead link now :(ktoś wie, gdzie mogę znaleźć link zastępczy? – Joe

1

Spróbuj tego:

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

„\” po prostu położyć miejsca w łańcuchu, ale „\” położy „\” w ciągu, który zostanie przekazany do powłoki, a powłoka ucieknie z kosmosu.

Jeśli to nie działa, podaj argumenty jako tablicę, po jednym elemencie dla każdego argumentu. W ten sposób powłoka nie angażuje się i nie potrzebujesz dziwnych ucieczek.

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

oops, że była literówka z mojej strony, próbowałem i to nie działa. – Alan

0

opcja Pawła działa, ale nadal musi uciec przestrzenie, takie jak tak:

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

rzecz, która zasysa na temat korzystania z tablicy ciągów jest to, że każdy param i jego opcja musi być w swoim żywiole. Na przykład nie można to zrobić:

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

Ale zamiast tego należy określić ją tak:

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