0

OS X 10.8 で Java アプリケーションから外部スクリプトを実行する際に、実際に問題が発生しています。Windowsで動作するため、OS Xで何が間違っているのかわかりません。

動作するもの (Windows):

String[] commands = {
    "\"" + _appDataDir + "\\Temp\\Workers\\" + _batchName + "\"", 
    "\"" + _appDataDir + "\\Temp\\frame%d.jpg\"", 
    "\"" + _fileName + "\""};
proc = rt.exec(commands);

だから私はOS X用に次のものを持っています:

String[] commands = {
    _appDataDir + "/Temp/Workers/" + _batchName,
_appDataDir + "/Temp/Workers/mac-ffmpeg",   
_appDataDir + "/Temp/frame%d.jpg", 
"\"" + _fileName + "\""};
proc = rt.exec(commands);

これは、ファイル名にスペースが含まれていない場合は機能しますが、スペースがある場合は「java.io.IOException: Bad file descriptor」エラーで失敗します。

現時点では、簡単な修正としてすべてのパスをスペースを含まないように変更しましたが、ユーザーが保存ダイアログから選択するため、fileName 文字列を制御できません。fileName を二重引用符で囲んだり付けたりせずに試してみましたが、どちらも違いはありません。

以下のようにProcessBuilderも試しました(「/ bin / bash /、-c」ビットの有無にかかわらず):

ProcessBuilder proc2 = new ProcessBuilder(
    "/bin/bash",
"-c",
_appDataDir + "/Temp/Workers/" + _batchName,
_appDataDir + "/Temp/Workers/mac-ffmpeg",
_appDataDir + "/Temp/frame%d.jpg",
"\"" + _fileName + "\""
);
proc = proc2.start();

しかし、これは同じエラーを出します。私が知る限り、他の同様の質問で提案されていることはすべて行っていますが、何も機能していません。どんなアイデアでも大歓迎です!

4

1 に答える 1

1

の周りに引用符は必要ありません。ここで"\"" + _fileName + "\""は単純なだけで_fileName機能します。Runtime.execto (または to )に配列を指定するとProcessBuilder、コマンドはすでに「単語」に分割されています。引用符を追加すると、名前が実際に二重引用符 + _fileName+ 二重引用符であるファイルを探すように指示されます。だけではなく_fileName

本当の問題は_batchName、おそらく他のプログラムを呼び出して実際の作業を行うシェル スクリプトであるプログラム内にある可能性があります。mac-ffmpegそのスクリプト内では、、frame%d.jpgおよび_fileName引数を$1$2およびとして受け取ります。たとえば、スクリプトが現在次のようなことを言っている場合、それらがスクリプト内で$3適切に引用されていることを確認する必要があります。

processFile $3

次に、言うように変更する必要があります

processFile "$3"

スペースを含むファイル名に対処する場合。または、一度に複数のファイルを処理するように設定されている場合:

processFiles $*

次に、それを置き換える必要があります

processFiles "$@"
于 2012-11-15T16:33:43.130 に答える