2012-07-31 86 views
0

我試圖在mac終端中使用「osascript」命令從我的java程序運行一個applescript。當我嘗試從終端嘗試它時,applescript與名稱中有空格的應用完美配合,如「osascript ActivateApp.scpt Google\ Chrome」,但是當我嘗試在java中使用它時,它將打開一個不帶空格的應用。到目前爲止,我已經試過從Java到終端到AppleScript的空白

Runtime.getRuntime().exec("osascript pathTo/ActivateApp.scpt Google Chrome"); 

Runtime.getRuntime().exec("osascript pathTo/ActivateApp.scpt Google\ Chrome"); 

但他們沒有工作。這裏是AppleScript的:

on run argv 
tell application (item 1 of argv) 
activate 
end tell 
end run 

回答

0

嘗試:

Runtime.getRuntime().exec("osascript pathToScript/ActivateApp.scpt 'Google Chrome'"); 

你看到的問題是,應用程序的名稱被當作兩個參數,而不是一個。在命令行中,轉義空格會導致bash不會基於它進行拆分,而是將其作爲參數的一部分傳遞。轉義它在Java中不起作用,因爲Java正在將轉義空間轉換爲常規空間。您可能可以通過執行類似"osascript pathToScript/ActivateApp.scpt Google\\ Chrome"這樣的\的方式來正確處理退出,但您最好仔細引用它。

這類問題的最佳解決方案是使用像Apache Commons Exec這樣的庫,它支持逐個構建一個命令,這樣您就不必擔心空格會無意間破壞應該是單個參數的內容,例如:

Map map = new HashMap(); 
map.put("file", new File("invoice.pdf")); 
CommandLine cmdLine = new CommandLine("AcroRd32.exe"); 
cmdLine.addArgument("/p"); 
cmdLine.addArgument("/h"); 
cmdLine.addArgument("${file}"); 
cmdLine.setSubstitutionMap(map); 
DefaultExecutor executor = new DefaultExecutor(); 
executor.setExitValue(1); 
ExecuteWatchdog watchdog = new ExecuteWatchdog(60000); 
executor.setWatchdog(watchdog); 
int exitValue = executor.execute(cmdLine); 

雖然它可能看起來複雜,首先,做正確的方式可以爲您節省大量的頭痛進一步向下行的時候,否則一些無關痛癢的一塊投入的毀壞東西微妙。