2012-07-31 3 views
0

Mac 터미널에서 "osascript"명령을 사용하여 Java 프로그램에서 applescript를 실행하려고합니다. AppleScript는 "osascript ActivateApp.scpt Google\ Chrome"과 같이 터미널에서 시도 할 때 이름에 공백이있는 응용 프로그램과 완벽하게 작동하지만 자바에서 사용하려고하면 공백없이 응용 프로그램이 열립니다. 지금까지 나는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); 

것은 그것에게 입력의 일부 그렇지 않으면 무해한 조각이 미묘하게 뭔가를 나누기 할 때 더 선 아래로 당신에게 많은 두통을 절약 할 수있는 올바른 방법을하고, 처음에는 복잡한 보일 수도 있지만.