0

我正在尝试使用osascriptmac 终端中的“”命令从我的 java 程序中运行一个 applescript。当我从终端尝试它时,applescript 与名称中带有空格的应用程序完美配合,例如“ osascript ActivateApp.scpt Google\ Chrome”,但是当我尝试在 java 中使用它时,它将打开一个只有没有空格的应用程序。到目前为止我已经尝试过

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

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

但它们都不起作用。这是小程序:

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

1 回答 1

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);

虽然一开始可能看起来很复杂,但是当一些原本无害的输入巧妙地破坏了某些东西时,以正确的方式进行操作可以为您省去很多麻烦。

于 2012-07-31T01:44:51.017 回答