2011-02-06 12 views
15

Jak mogę wykonać polecenie systemu Java (powłoki), które ma spację w nazwie ścieżki?Java wykonać polecenie z odstępem w nazwie ścieżki

Próbowałem wstawiania cudzysłowów i ukośnika odwrotnego(), ale to nie działa.

ln -s "dir1/dir2" "my\ dir/dir2" 
+0

'„mój \ dir/dir2”' nie jest prawidłowy ciąg w Javie, ponieważ '„\”' jest nie jest prawidłową sekwencją ucieczki. Spróbuj '" my \\ dir/dir2 "'. –

+0

Nie, to jest wynik, gdy wydrukuję ciąg. Już używam "\\" – LanguagesNamedAfterCofee

+0

Ah, okay. To nie było jasne. Czy używasz OS X przez przypadek? http://stackoverflow.com/questions/697621/ –

Odpowiedz

24

Zdecydowanie najbardziej niezawodnym sposobem jest użycie Runtime.exec(String[] cmdarray).

Jeśli używasz Runtime.exec(String command), Java tylko rozdziela polecenie na białe znaki.

ciąg poleceń jest podzielony na tokeny za pomocą StringTokenizer utworzonego przez wywołanie new StringTokenizer (polecenie) bez dalszej modyfikacji kategorii postaci. Żetony produkowane przez tokenizera są następnie umieszczane w nowej tablicy cmdarray, w tej samej kolejności.

Zobacz także g++: File not found

Albo użyć ProcessBuilder coś takiego:

ProcessBuilder pb = new ProcessBuilder("ln", "-s", "dir1/dir2", "my dir/dir2"); 
Process p = pb.start(); 
+6

ProcessBuilder jest zalecany sposób, ponieważ może obsłużyć miejsca znacznie lepiej niż Runtime.exec() –

+0

Właśnie dodałem przykład przy użyciu ProcessBuilder na podstawie Javadocs. Czy to wygląda na Ciebie? – Mikel

+1

Próbowałem go używać, ale nadal nie działa. Czy muszę podać pełną ścieżkę do pliku wykonywalnego? – LanguagesNamedAfterCofee

6

Czy naprawdę trzeba wykonać go w powłoce (np musisz zapłacić ekspansję rzeczy jak ~ lub * itd.)? Jeśli nie, można powołać ln bezpośrednio:

Process p = 
    Runtime.getRuntime() 
    .exec(new String[]{"/bin/ln","-s","dir1/dir2", "my\\ dir/dir2"}); 

Jeśli naprawdę potrzebujesz powłokę, spróbuj tego (może to trzeba trochę szczypanie w zależności od tego, jak powłoka przetwarza cytaty):

Process p = 
    Runtime.getRuntime() 
    .exec(new String[]{"/bin/sh", "-c", "ln -s \"dir1/dir2\" \"my\\ dir/dir2\""}); 

Edycja:

Miałem wrażenie, że druga ścieżka ma dosłowny ukośnik odwrotny. Jeśli nie ma usunąć \\ z literałów napisanych powyżej.

1

Żadna z nich nie działa na Lion. Jednak poniższe działa i jest kompatybilny wstecz dla Tiger.

Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","/path/to/file/space*init"}); 
0

Można go używać w następujący sposób bez konieczności wprowadzania jakichkolwiek backslashy: Runtime.getRuntime().exec(new String[]{"ln", "-s", "dir1/dir2", "my dir/dir2"});

Powiązane problemy