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

あなたが見ている問題は、アプリケーション名が1つではなく2つの引数として受け取られていることです。コマンドラインでスペースをエスケープすると、bashはそれに基づいて分割されず、引数の一部として渡されます。Javaはエスケープされたスペースを通常のスペースに変換しているため、エスケープはJavaでは機能しません。が通過するよう"osascript pathToScript/ActivateApp.scpt Google\\ Chrome"に次のようなことを行うことで、エスケープを適切に処理できる可能性がありますが、より慎重に引用することをお勧めします。\

この種の問題に対する最善の解決策は、コマンドを1つずつ構築することをサポートする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 に答える