2013-07-12 4 views
10

zu bekommen Was ich versuche zu tun:Wie Name der vorderste App mit Applescript bekommen und es verwenden, um die Filepath

Als ich in einem meiner Texteditoren bin (TextEdit, Byword, FoldingText) Ich möchte Dieses AppleScript zeigt den Dateipfad an.

Ich dachte, ich frage nach der vordersten Fenster-App, ich bin der Name der App, schön und leicht, und dann kann ich im nächsten Schritt nach dem POSIX-Pfad fragen.

Das Problem:

Das Skript ist bereits 99% gibt, aber ich bin etwas fehlt. Wenn ich versuche, die Variable der activeApp zu verwenden ist es nicht funktioniert und ich diesen Fehler:

Error Number:System Events got an error: Can’t get application {"TextEdit"}. 
-1728 

Hier ist das Skript:

tell application "System Events" 
    set activeApp to name of application processes whose frontmost is true 

    --This doesn't work either: 
    --do shell script "php -r 'echo urldecode(\"" & activeApp & "\");'" 

    tell application activeApp 
     set myPath to POSIX path of (get file of front document) 
    end tell 
    display dialog myPath 
end tell 

Wenn ich activeApp mit "TextEdit" alles funktioniert auszutauschen. Hilfe wäre willkommen.

Vielleicht gibt es etwas hier in das hilft: Get process name from application name and vice versa, using Applescript

Antwort

7

Entweder erhalten die path Eigenschaft eines Dokuments oder Systemereignisse benutzen Sie value of attribute "AXDocument":

try 
    tell application (path to frontmost application as text) 
     (path of document 1) as text 
    end tell 
on error 
    try 
     tell application "System Events" to tell (process 1 where frontmost is true) 
      value of attribute "AXDocument" of window 1 
     end tell 
     do shell script "x=" & quoted form of result & " 
     x=${x/#file:\\/\\/} 
     x=${x/#localhost} # 10.8 and earlier 
     printf ${x//%/\\\\x}" 
    end try 
end try 

Die erste Methode mit Vorschau hat nicht funktioniert, Textmate 2, Sublime Text oder iChm und das zweite Verfahren hat nicht mit Acorn gearbeitet. Die zweite Methode erfordert Zugriff für die Aktivierung von Hilfsgeräten.

+0

Der Versuchsteil ist einfach großartig. Sehr flexibel und viel weniger Handarbeit, um all die verschiedenen Apps dazu zu bringen, den richtigen Pfad auszugeben (ich habe einfach nicht mehr IF-Bedingungen geschrieben, sobald ich das getestet habe). Apropos, "wenn" ich mit nvALT arbeiten kann, dann habe ich sogar mehr, als ich wollte. – pattulus

+0

Sie könnten etwas wie "Tell-Anwendung" Systemereignisse "verwenden, um zu sagen (Prozess 1, wo Front wahr ist), wenn der Name" nvALT "ist (Systemattribut" HOME ") &"/Notes/"& Wert des Textfelds 1 der Gruppe 1 der Werkzeugleiste 1 von Fenster 1 & ".txt"). – user495470

+1

Das ist nett. Vielen Dank. Aber wenn ich das Skript ausführe, entfernt es den Text am Anfang des Pfades, so dass '/ users/Benutzername/Pfad/zu/Datei' 'sername/Pfad/zu/Datei' wird. Irgendeine Idee warum? – drstevok

1

Sie fordern ...

set activeApp to name of application processes whose frontmost is true 

Hinweis "Prozesse", das ist Plural mit Ihnen so Apple mehrere Prozesse in Antwort bekommen gibt Ihnen eine Liste von Namen. Obwohl nur eine Anwendung zurückgegeben wird, ist sie immer noch im Listenformat. Sehen Sie auch, dass Ihr Fehler {"TextEdit"} enthält. Die Klammern um den Namen bedeuten, dass es sich um eine Liste handelt. Der Fehler zeigt also das Problem an.

Sie können keine Namensliste an die nächste Codezeile übergeben. Als solche haben Sie ein paar Möglichkeiten. 1) Sie können nur einen Prozess statt aller Prozesse anfordern. Das wird eine Zeichenfolge anstelle einer Liste zurückgeben. Versuchen Sie diesen Code ...

2) Sie können mit der Liste arbeiten, indem Sie "Element 1 der Liste" verwenden. Versuchen Sie diesen Code ...

set activeApps to name of application processes whose frontmost is true 
set activeApp to item 1 of activeApps 

Schließlich sollten Sie Systemereignisse nicht sagen, um der Anwendung zu sagen. Trennen Sie diese 2 Blöcke von Code. So würde ich Ihren Code schreiben.

tell application "System Events" 
    set activeApp to name of first application process whose frontmost is true 
end tell 

try 
    tell application activeApp 
     set myPath to POSIX path of (get file of front document) 
    end tell 

    tell me 
     activate 
     display dialog myPath 
    end tell 
on error theError number errorNumber 
    tell me 
     activate 
     display dialog "There was an error: " & (errorNumber as text) & return & return & theError buttons {"OK"} default button 1 with icon stop 
    end tell 
end try 

Ich kann nicht versprechen, dass der Code "Datei von Frontdokument abrufen" funktioniert. Das hängt von der Anwendung ab. Nicht alle Anwendungen werden diese Anfrage verstehen. Deshalb habe ich einen Try Block benutzt. In jedem Fall können Sie sicher sein, dass Sie die richtige Anwendung adressieren. Viel Glück.

+0

Danke für die Korrektur mich auf der Mehrzahl der Prozess ... Ich hatte nicht daran gedacht. Ich lerne immer noch die Grundlagen (gestern habe ich an einer Liste von AppleScript gearbeitet und die geschweiften Klammern hier haben mich wundern lassen). // Außerdem habe ich nun die beiden Teile wie von dir vorgeschlagen getrennt. Trotzdem habe ich kein Glück. // Ich habe dein Skript kopiert und es in meinen Texteditoren versucht, aber es gibt immer noch das Problem -1728. – pattulus

+0

Ich habe den Code aktualisiert ... Ich habe "Name des ersten Bewerbungsprozesses" vergessen. Bitte versuchen Sie es erneut. – regulus6633

+0

Ich habe meine Beschreibung aktualisiert und erkläre besser, wonach ich suche. Leider versucht "Name des ersten" nur eine Variante des Fehlers ausgibt: "Fehler" AppleScript Editor hat einen Fehler: Kann Datei des Dokuments nicht erhalten 1. "Nummer -1728 von Datei des Dokuments 1" – pattulus

1

Ich habe eine Zeit lang diese Schnipsel verwenden, scheint für alle Cocoa-Anwendungen (nicht sicher X11) zu arbeiten:

set front_app to (path to frontmost application as Unicode text) 

tell application front_app 
    -- Your code here 
end tell 
+0

Vielen Dank für Ihren Beitrag , aber das bekommt nur die App, aber nicht das aktive/vorderste Dokument. – pattulus

0

Nichts davon scheint mit einer kompilierten Apple als Anwendung gespeichert zu arbeiten und auf dem Dock platziert. Wann immer Sie die Anwendung ausführen, ist IT die Front, nicht die Anwendung, die das Frontfenster anzeigt. Diese Anwendung wird inaktiv, wenn mein Applescript ausgeführt wird. Wie schreibe ich eine Applescript-Anwendung, die bei der Ausführung nicht aktiv ist?

Ich habe vielleicht eine Lösung für das oben genannte Problem gefunden. Sagen Sie dem Benutzer einfach, die gewünschte Anwendung zu reaktivieren und ihnen Zeit zu geben.

tell application "Finder" 
    activate 
    say "Click front window of your application" 
    delay 5 
    set myapp to get name of first application process whose frontmost is true 
-- etc. 
-- your code 
end tell 
Verwandte Themen