Pau*_*lor 5 java scripting applescript scriptengine
通过这个简单的AppleScript,我可以列出iTunes中所有歌曲的名称
tell application "iTunes"
set mainLibrary to library playlist 1
repeat with nexttrack in (get every track of mainLibrary)
try
name of nexttrack
end try
end repeat
end tell
Run Code Online (Sandbox Code Playgroud)
然后我使用ScriptEngine将其作为Java 7代码运行,但是很明显如何获取脚本的结果,在这种情况下只是最后一个轨道的名称.
StringBuilder script =new StringBuilder();
script.append("tell application \"iTunes\"\n");
script.append("set mainLibrary to library playlist 1\n");
script.append("repeat with nexttrack in (get every track of mainLibrary)\n");
script.append("try\n");
script.append("name of nexttrack\n");
script.append("end try\n");
script.append("end repeat\n");
script.append("end tell\n");
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("AppleScript");
System.out.println(engine.eval(script.toString()));
How do can I capture the name of all tracks , i.e all output from the script. I assume I have to redirect standard out to a Reader, but cannot see how to do it.
Run Code Online (Sandbox Code Playgroud)
更新:
I found this article
Run Code Online (Sandbox Code Playgroud)
http://www.informit.com/articles/article.aspx?p=696621&seqNum=6
但是通过代码更新
StringBuilder script =new StringBuilder();
script.append("tell application \"iTunes\"\n");
script.append("set mainLibrary to library playlist 1\n");
script.append("repeat with nexttrack in (get every track of mainLibrary)\n");
script.append("try\n");
script.append("name of nexttrack\n");
script.append("end try\n");
script.append("end repeat\n");
script.append("end tell\n");
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("AppleScript");
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
StringWriter swError = new StringWriter();
PrintWriter pwError = new PrintWriter(swError);
engine.getContext().setWriter(pw);
engine.getContext().setErrorWriter(pwError);
System.out.println(engine.eval(script.toString()));
System.out.println("************* engine:"+sw.getBuffer());
System.out.println("************* engine error:"+swError.getBuffer());
Run Code Online (Sandbox Code Playgroud)
只是输出
See You on the Other Side (short)
************* engine:
************* engine error:
Run Code Online (Sandbox Code Playgroud)
所以你可以清楚地看到脚本工作,因为eval显示了最后一个轨道的名称,但我从重定向的编写器中得不到任何回复.想知道这实际上适用于Applecript吗?
更新2 我在Javascript中编写了一个测试,并发现设置编写器DID WORK为此,所以我想也是
我想(2)是问题所在,但我找不到任何关于在Applescript中输出文本的引用,echo不是一个有效的命令,而且print命令确实会尝试打印到打印机而不是打印到stdout,因为它会在Java或C.
更新3 所以我无法让这个工作,现在想知道Applescript是否只写了返回值.我找到了一个使用stdout的例子(或者我认为),但我认为这只是一个命名约定,事实上它所做的只是不断地将数据附加到变量,并最终返回.
所以我通过使用存储在文件中的以下脚本来实现它的工作,然后在Java中使用engine.eval(new java.io.FileReader(" filename "))
tell application "iTunes"
set output to ""
set mainLibrary to library playlist 1
repeat with nexttrack in (get every track of mainLibrary)
if (class of nexttrack is file track) then
try
set trackname to name of nexttrack
set loc to location of nexttrack
set locpath to POSIX path of loc
set persistid to persistent ID of nexttrack
set nextline to trackname & "::" & locpath & "::" & persistid
set output to output & "\n" & nextline
end try
end if
end repeat
copy output to stdout
end tell
Run Code Online (Sandbox Code Playgroud)
但这实际上并没有解决原来的问题,它的一个问题是,如果有任何错误,那么我不会得到任何回报,而如果它在读取我的iTuneslibrary中途失败并且我使用stdout我至少会得到一半数据回来了.
为了回答你原来的问题,你会得到在脚本末尾“返回”的任何内容。如果您没有特定的“return”语句,那么默认情况下您将返回最后一个操作的结果(在您的情况下是重复循环的最后一次迭代)。因此,如果您需要的不仅仅是最后返回的操作,则必须在脚本中创建返回值,然后在最后返回它。
但这实际上并没有解决最初的问题,而且它的一个问题是,如果有任何错误,那么我将不会得到任何返回,而如果它在读取我的 iTuneslibrary 的过程中失败并且我正在使用 stdout,我至少会得到一半数据返回。这是不正确的。代码周围的 try 块将使 applescript 忽略错误并继续,因此您收集的任何没有错误的内容仍将被返回。
请注意,您最新的 applescript 代码中有一些错误。特别是这一行毫无意义,因为 applescript 不知道 stdout 是什么。所以你的评论是不正确的。
copy output to stdout
Run Code Online (Sandbox Code Playgroud)
这就是你需要做的。如前所述,您可以使用“return”来返回某些内容。所以我清理了你的代码。这会将重复循环的每一行放在输出变量的单独行上,您在代码末尾返回该变量,然后将其带入 JavaScript 代码后即可对其进行解析。尝试这个...
tell application "iTunes"
set output to ""
set mainLibrary to library playlist 1
repeat with nexttrack in (get every track of mainLibrary)
if (class of nexttrack is file track) then
try
set trackname to name of nexttrack
set loc to location of nexttrack
set locpath to POSIX path of loc
set persistid to (persistent ID of nexttrack) as text
set nextline to trackname & "::" & locpath & "::" & persistid & return
set output to output & nextline
end try
end if
end repeat
end tell
return output
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2268 次 |
| 最近记录: |