2013-08-12 1 views
5

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 kann
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 

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

  1. 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)
  2. 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.

Antwort

2

Um Ihre ursprüngliche Frage zu beantworten, erhalten Sie zurück, was Sie am Ende des Skripts "zurückgeben". Wenn Sie keine bestimmte "return" -Anweisung haben, erhalten Sie standardmäßig das Ergebnis der letzten Aktion (was in Ihrem Fall die letzte Iteration der Wiederholungsschleife ist). Wenn Sie also mehr als die letzte zurückgegebene Aktion benötigen, müssen Sie den Rückgabewert in Ihrem Skript erstellen und am Ende zurückgeben.

aber dieses nicht eigentlich die ursprüngliche Frage lösen, und das ein Problem mit ihm ist, dass, wenn es einen Fehler, dann wird nicht alles, was ich bekommen zurück, während wenn es halbwegs meine iTuneslibrary gescheitert durch das Lesen und ich war Mit stdout würde ich zumindest die Hälfte der Daten zurückbekommen. Das ist falsch. Der try-Block um Ihren Code herum wird bewirken, dass applescript die Fehler ignoriert und fortfährt, sodass alles, was Sie sammeln, keinen Fehler enthält, trotzdem zurückgegeben wird.

Beachten Sie, dass in Ihrem neuesten applescript-Code einige Fehler aufgetreten sind. Gerade diese Zeile macht keinen Sinn, da applescript nicht weiß, was stdout ist. Dein Kommentar ist also falsch.

copy output to stdout 

Hier ist, was Sie tun müssen. Wie bereits erwähnt, verwenden Sie "return", um etwas zurückzugeben. Also habe ich deinen Code aufgeräumt. Dadurch wird jede Zeile der Wiederholungsschleife in eine separate Zeile der Ausgabevariablen geschrieben, die Sie am Ende Ihres Codes zurückgeben, die Sie dann parsen können, sobald Sie sie in Ihren JavaScript-Code einfügen. Versuchen Sie dies ...

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 
+0

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. –

+0

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

+0

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 –

Verwandte Themen