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:错误的文件描述符”错误时会失败。

目前,我已将所有路径更改为没有空格作为一个简单的修复,但我无法控制 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.exec当您向(或)提供数组时,ProcessBuilder您已经将命令拆分为“单词” - 如果添加引号,您会告诉它查找名称实际上是双引号 + _fileName+ 双引号的文件而不仅仅是_fileName.

真正的问题可能出在_batchName程序中,它可能是一个通过调用其他程序来完成实际工作的 shell 脚本。在该脚本中,您将收到mac-ffmpeg,frame%d.jpg和, 和 的_fileName参数$1$2并且$3您需要确保它们在脚本中被正确引用,例如,如果脚本当前显示类似

processFile $3

那么你需要改变它说

processFile "$3"

如果要处理包含空格的文件名。或者,如果它设置为一次处理多个文件:

processFiles $*

那么你需要用

processFiles "$@"
于 2012-11-15T16:33:43.130 回答