Mit diesem einfachen Stück Applescript tun bekommen ichWie Sie die Ausgabe von Javascript in Java unter Verwendung von Script
die Namen aller Songs in iTunes Liste kanntell 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
Ich betreibe es dann als Java 7 Code Scriptengine verwenden, jedoch Es ist nur offensichtlich, wie man das Ergebnis des Skripts erhält, das in diesem Fall nur der Name des letzten Titels ist.
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.
Update:
I found this article
http://www.informit.com/articles/article.aspx?p=696621&seqNum=6
Aber Aktualisierung von Code zu
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());
gibt nur
See You on the Other Side (short)
************* engine:
************* engine error:
So können Sie deutlich sehen, das Skript funktioniert, wie die Eval zeigt den Namen des letzten Titels, aber ich bekomme nichts zurück von den umgeleiteten Autoren. Fragen Sie sich, ob dies tatsächlich für AppleScript funktioniert?
Update 2 ich einen Test in Javascript geschrieben und fanden die Autoren WORK für die DID Einstellung so Im, dass entweder denken
- Es ist etwas in Script-Engine für Applescript (Im mit einem letzten Build gebrochen 1.7.0_40-ea-b29) der frühen Zugang Java-Version 7 auf OSX)
- Mein Applescript ist falsch, das heißt nicht nur Namen Nexttrack sollte ich so etwas wie echo Namen Nexttrack tun tatsächlich mache ich Gehe nach stout.
I (2) war das Problem denken möchte, aber ich canot jede Bezugnahme auf der Ausgabe Text in Applescript finden, Echo kein gültiger Befehl ist und der Druckbefehl zum Drucken funktioniert tatsächlich versuchen an einen Drucker eher auf der Standardausgabe als drucken, wie es wäre in Java oder C
Update 3 so konnte ich diese Arbeit nicht bekommen, und jetzt fragen, ob Apple immer nur den Rückgabewert schreibt. Ich fand ein Beispiel für die Verwendung von stdout (oder so dachte ich), aber ich denke, das war nur eine Namenskonvention, und in der Tat ist alles, was es tut, kontinuierlich Daten an eine Variable anhängen und schließlich zurückgeben.
So habe ich es etwas Arbeit erhalten, indem Sie das folgende Skript in einer Datei gespeichert ist, und dann in Java mit engine.eval (neu java.io.FileReader ("Dateiname" verwendet)
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
aber das löst nicht wirklich die ursprüngliche Frage, und das eine Problem damit ist, dass, wenn es irgendeinen Fehler gibt, werde ich nichts zurückbekommen, wohingegen, wenn es halb durch das Lesen meiner iTunesLibrary fehlte und ich stdout verwendete, würde ich mindestens die Hälfte bekommen die Daten zurück.
Vielen Dank, ich verstehe Ihre Antwort. Aber was ich nicht verstehe, ist, ob applescript verwendet werden kann, um output in stdout zu schreiben, während es läuft, oder ob es niemals in stdout schreiben kann, außer dass es die letzte value/return-Anweisung schreibt, wenn das Skript beendet ist. Dies ist in meinem Fall wichtig, da eine iTunes-Bibliothek 50.000 Titel enthalten kann und daher die Ausgabe 50.000 Titelpositionen und Namen enthalten müsste. –
Nein, Sie können nicht in stdout schreiben, während das Skript läuft. Sie können nur einmal am Ende des Skripts wie beschrieben schreiben. Sie können jedoch in der Wiederholungsschleife Zeile für Zeile in eine Datei schreiben und dann diese Datei aus Ihrem JavaScript-Code lesen, nachdem das Applescript abgeschlossen ist ... falls dies erforderlich ist. – regulus6633
Seine eigentlich aus Java-Code, das ist eine Schande Ich hoffte, ich könnte die Erstellung von temporären Dateien vermeiden, scheint wirklich seltsam das Handbuch für osascript scheint zu implizieren Ausgabe wird geschrieben, wenn -e Option –