2011-02-06 18 views
15

パス名にスペースを含むJava System(シェル)コマンドを実行するにはどうすればよいですか?Javaがパス名にスペースを含むコマンドを実行します

引用符とバックスラッシュ()を入れてみましたが、動作しません。

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

'「私の\ DIR/dir2のは、」' Javaで有効な文字列ではありません有効なエスケープシーケンスではありません。 '' my \\ dir/dir2 ''を試してください。 –

+0

いいえ、それは私が文字列をprintlnするときの出力です。私はすでに "\\"を使用しています – LanguagesNamedAfterCofee

+0

ああ、大丈夫です。それは明らかではなかった。万が一OS Xを使用していますか? http://stackoverflow.com/questions/697621/ –

答えて

24

これまでのところ最も信頼性の高い方法はRuntime.exec(String[] cmdarray)です。

Runtime.exec(String command)を使用すると、Javaは空白でコマンドを分割するだけです。

コマンド文字列は、新しい文字列カテゴリをさらに変更することなく、新しいStringTokenizer(コマンド)の呼び出しで作成されたStringTokenizerを使用してトークンに分割されます。トークナイザによって生成されたトークンは、新しい文字列配列cmdarrayに同じ順序で配置されます。

も参照してくださいg++: File not found

またはこのようなProcessBuilderなものを使用します。

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

ProcessBuilderは推奨される方法です。これはRuntime.exec()よりもはるかに優れた空間を扱うことができるためです –

+0

私は実際にJavadocに基づいてProcessBuilderを使ってサンプルを追加しました。それはあなたに見えますか? – Mikel

+1

これを使ってみましたが、それでも動作しません。実行ファイルへのフルパスを指定する必要がありますか? – LanguagesNamedAfterCofee

6

をあなたは本当に例えば(シェルでそれを実行する必要がありますか、あなたは~のようなものの拡大をシェルする必要がありますか*など)?ない場合は、直接lnを呼び出すことができます:あなたは本当にシェルが必要な場合は

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

、これは(これはシェルが引用符を処理する方法に応じて、少し微調整が必​​要な場合があります)してみてください。

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

編集:

私は印象の下に2番目のパスにリテラルのバックスラッシュがあります。上記の文字列リテラルから\\を削除する予定がない場合。

1

これらはライオンでは動作しません。ただし、以下は動作し、Tigerとの下位互換性があります。

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

あなたはバックスラッシュを導入することなく、次のようにそれを使用することができます: `「\」は`ですので Runtime.getRuntime().exec(new String[]{"ln", "-s", "dir1/dir2", "my dir/dir2"});

関連する問題