スペースを含む引数を使用したランタイムexec

Runtime.exec()呼び出しで実行しようとしているアプリケーションがあります。

引数の中にはスペースがあるので、LinuxとWindowsの両方で機能するように引数を適切にエスケープするにはどうすればよいですか。私はWindowsを知っています、あなたは通常スペースを含む文字列を二重引用符で囲みますが、linuxはスラッシュを使います。

スペースがあれば、実行しているプログラム(現時点ではWindowsのxcopy)はほとんどすぐに戻り、パラメータの数が間違っていることを示すと予想されます。しかし、waitFor()呼び出しがハングします。

String[] commandArray = new String[3];
commandArray[0] = applicationPath;
commandArray[1] = someFileWhichMayHaveSpaces;
commandArray[2] = anotherFileWhichMayHaveSpaces;

Process appProcess = Runtime.getRuntime().exec(commandArray);
int returnCode = appProcess.waitFor();
2
同じ引数リストを持つProcessBuilderに切り替えても効果はありません。
追加された 著者 Stealth Rabbi,
同じ引数リストを持つProcessBuilderに切り替えても効果はありません。
追加された 著者 Stealth Rabbi,
ProcessBuilder に切り替えます
追加された 著者 Jigar Joshi,
ProcessBuilder に切り替えます
追加された 著者 Jigar Joshi,
@Richard:Windowsでは、特定のアプリケーションがそのコマンドライン文字列をどのように解析するかをすでに知っている場合を除き、ターゲットアプリケーションに配列を渡す安全な方法はありません。
追加された 著者 Harry Johnston,
@Richard:Windowsでは、特定のアプリケーションがそのコマンドライン文字列をどのように解析するかをすでに知っている場合を除き、ターゲットアプリケーションに配列を渡す安全な方法はありません。
追加された 著者 Harry Johnston,
Runtime.exec()を使用するときに引数をエスケープする必要はないと思います。パラメータは、変更することなくターゲットアプリケーションに直接転送されます。
追加された 著者 Richard,
Runtime.exec()を使用するときに引数をエスケープする必要はないと思います。パラメータは、変更することなくターゲットアプリケーションに直接転送されます。
追加された 著者 Richard,

6 答え

私は数週間前に開発してきたアプリケーションと同じ問題を抱えています。最終的に、私は生の Runtime.exec()Runtime.exec()の落とし穴)そしてApache Commons Execライブラリを使うことにしました。それは箱から出してすぐに様々な問題を解決したり、実行中にランダムにぶら下がったりするのを助けました。その addArguments()メソッドは handleQuoting パラメータを取るので、私はOSをチェックし、私はWindows用にクォート処理を要求する簡単なutilメソッドを作成しました。いくつかの実用的な例が必要な場合は、図書館のWebサイトにいくつかのチュートリアルがあります。 LaTeX Studio プロジェクトを開きます。

3
追加された

私は数週間前に開発してきたアプリケーションと同じ問題を抱えています。最終的に、私は生の Runtime.exec()Runtime.exec()の落とし穴)そしてApache Commons Execライブラリを使うことにしました。それは箱から出してすぐに様々な問題を解決したり、実行中にランダムにぶら下がったりするのを助けました。その addArguments()メソッドは handleQuoting パラメータを取るので、私はOSをチェックし、私はWindows用にクォート処理を要求する簡単なutilメソッドを作成しました。いくつかの実用的な例が必要な場合は、図書館のWebサイトにいくつかのチュートリアルがあります。 LaTeX Studio プロジェクトを開きます。

3
追加された

少なくともWindows環境でのテストでは、引数内のスペースに問題はまったくないようです。問題は、コピー元がファイルまたはディレクトリの場合、xcopyが質問への回答を要求/停止していたことです。私はそれがスペースを詰まらせていると仮定しました、しかしそれはそうではありませんでした。問題のコードをそのまま使用できましたが、ProcessBuilderを使用する必要はありませんでした。

0
追加された

少なくともWindows環境でのテストでは、引数内のスペースに問題はまったくないようです。問題は、コピー元がファイルまたはディレクトリの場合、xcopyが質問への回答を要求/停止していたことです。私はそれがスペースを詰まらせていると仮定しました、しかしそれはそうではありませんでした。問題のコードをそのまま使用できましたが、ProcessBuilderを使用する必要はありませんでした。

0
追加された

Windowsでは、疑わしい場合は、文字列配列ではなく文字列をコマンドライン引数として使用する Runtime.exec のオーバーロードのいずれかを使用する必要があります。これにより、新しいプロセス用のコマンドライン文字列を自分で作成できるので、構文が正しいことを確認できます。

配列メソッドを使用する場合、Javaは配列を単一の文字列に変換する必要があります。これは、ターゲットプロセスがMicrosoft Cランタイムコマンドラインパーサー(または互換性のあるもの)を使用することを前提としている標準アルゴリズムを使用して行います。これは通常問題ありませんが、常にではありません。

0
追加された

Windowsでは、疑わしい場合は、文字列配列ではなく文字列をコマンドライン引数として使用する Runtime.exec のオーバーロードのいずれかを使用する必要があります。これにより、新しいプロセス用のコマンドライン文字列を自分で作成できるので、構文が正しいことを確認できます。

配列メソッドを使用する場合、Javaは配列を単一の文字列に変換する必要があります。これは、ターゲットプロセスがMicrosoft Cランタイムコマンドラインパーサー(または互換性のあるもの)を使用することを前提としている標準アルゴリズムを使用して行います。これは通常問題ありませんが、常にではありません。

0
追加された