2012-11-15 106 views
0

我在从OS X 10.8上的Java应用程序运行外部脚本时遇到了实际问题。它适用于Windows,所以不知道我在做什么错的OS X.在OS X上从Java应用程序运行外部脚本

什么工作(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:错误文件描述符”错误的空格时失败。

目前,我已经改变了所有的路径有没有空格作为一个简单的办法,但因为这是由用户从一个保存对话框中选择了我没有在文件名字符串控制。我已经尝试过在文件名周围没有双引号但没有任何区别。

我也试过的ProcessBuilder如下(包括有和没有 “/斌/庆典/,-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(); 

但是这给了同样的错误。据我所知,我正在做其他类似问题的建议,但没有任何工作。任何想法,将不胜感激!

回答

1

你不需要"\"" + _fileName + "\""附近的报价,只是一个普通的_fileName会在这里工作。当您提供一个数组来Runtime.exec(或ProcessBuilder)你已经分割你的命令成“言” - 如果你增加你告诉它来寻找其名称的文件的报价实际上是双引号+ _fileName +双引号而不仅仅是_fileName

真正的问题可能在于_batchName程序,该程序大概是一个通过调用其他程序来执行实际工作的shell脚本。在该脚本您将收到mac-ffmpegframe%d.jpg_fileName论据$1$2$3,你需要确保他们正确的脚本,例如内引用如果脚本目前说像

processFile $3 

,那么你需要去改变它说

processFile "$3" 

如果是应付包含空格的文件名。或者,如果它被设置在一次处理多个文件:

processFiles $* 

,那么你需要更换与

processFiles "[email protected]" 
+0

这是伟大的,谢谢!在脚本中使用引号本身已经成功了。是什么把我这里的是,当我试图运行脚本,并从终端传递的参数(带双引号),它工作得很好,所以我本以为这个问题与Java代码,而不是脚本所在。 – aritchie

相关问题