2009-03-30 3 views
9

OS Xでは、何かしようとしていますが、パスにスペースが含まれていると動作しません。私は引用符でパスを囲んで、スペースをエスケープし、さらに\ u0020を使ってみました。例えばJavaのスペースがOS Xのパスを実行

、これは動作します:

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

しかし、スペース、これらの作品のどれもがあるかどう:

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

のアイデアは?

編集:エスケープされたバックスラッシュ...まだ動作しません。

答えて

11

Sun's forumsでこの問題の要約があります...スレッドの最後のポストが提案された解決策をまとめたOS Xに制限されない

かなり一般的な問題のようです。ポールのオプションの作品は

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

ありがとう!実際のプログラムではいくつかのフラグが追加されています。このような配列を使用すると、すべてを分割する必要があります。例: String [] args = new String [] {"open"、 "-n"、 "folder name/toast.sh"}; – Alan

+0

デッドリンク今すぐ:(誰かがどこで代替リンクを見つけることができるか知っていますか? – Joe

1

これを試してみてください:

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

「\」単なる文字列にスペースを入れてますが、「\」は、シェルに渡される文字列に「\」を置くと、シェルはスペースをエスケープします。

これでうまくいかない場合は、引数として引数として配列を渡します。そうすれば、シェルは関与せず、奇妙なエスケープは必要ありません。

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

おっと、それは私の一部にタイプミスでした、私が試してみましたが、これは動作しません。 – Alan

0

(フォーラムは、これはあまりにも動作します示唆)

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

か、あなたはまだのようなスペースをエスケープする必要があります。本質的には、String[]配列を受け取りRuntime.execの形式を使用しますしたがって:

文字列配列を使用することについて嫌なことは、各パラメータとそのオプションがそれぞれの要素になければならないということです。たとえば、あなたがこれを行うことはできません。

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

をしかし、その代わりにそのようにそれを指定する必要があります。

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