Как получить имя самого первого приложения с AppleScript и использовать его для получения пути к файлу
Что я пытаюсь сделать:
Когда я вхожу в один из своих текстовых редакторов (TextEdit, Byword, FoldingText), я хочу, чтобы этот AppleScript отображал путь к файлу.
Я решил запросить самое первое приложение окна, чтобы получить имя приложения хорошо и легко, а затем я могу задать путь POSIX на следующем шаге.
Проблема:
script уже на 99%, но я чего-то не хватает. Когда я пытаюсь использовать переменную activeApp
, она не работает, и я получаю эту ошибку:
Error Number:System Events got an error: Can’t get application {"TextEdit"}.
-1728
Здесь script:
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
Если я обмениваюсь activeApp
с "TextEdit"
, все работает. Помощь будет оценена.
Может быть, здесь есть что-то, что помогает: Получить имя процесса из имени приложения и наоборот, используя Applescript
Ответы
Ответ 1
Либо получить свойство path
документа, либо использовать системные события, чтобы получить 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
Первый метод не работал с Preview, TextMate 2, Sublime Text или iChm, а второй метод не работал с Acorn. Второй способ требует разрешения доступа для вспомогательных устройств.
Ответ 2
Вы просите...
set activeApp to name of application processes whose frontmost is true
Обратите внимание на "процессы", что означает множественное значение, что вы можете получить несколько процессов в ответ, поэтому applescript дает вам список имен. Хотя только одно приложение возвращается, оно все еще находится в формате списка. Также убедитесь, что ваша ошибка содержит { "TextEdit" }. Скобки вокруг имени означают его список, поэтому ошибка показывает вам проблему.
Вы не можете передать список имен в следующую строку кода. Таким образом, у вас есть несколько вариантов. 1) вы можете запросить только один процесс вместо всех процессов. Это вернет строку вместо списка. Попробуйте этот код...
set activeApp to name of first application process whose frontmost is true
2) вы можете работать со списком, используя "элемент 1 списка". Попробуйте этот код...
set activeApps to name of application processes whose frontmost is true
set activeApp to item 1 of activeApps
Наконец, вы не должны сообщать системным событиям, чтобы сообщить об этом приложению. Отделите эти 2 блока блоков кода. Вот как я напишу ваш код.
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
Я не могу обещать, что код "получить файл переднего документа" будет работать. Это зависит от приложения. Не все приложения поймут этот запрос. Вот почему я использовал блок try. В любом случае, хотя вы можете быть уверены, что обращаетесь к правильному приложению. Удачи.
Ответ 3
Я использовал этот фрагмент некоторое время, кажется, работает для всех приложений Cocoa (не уверен в X11):
set front_app to (path to frontmost application as Unicode text)
tell application front_app
-- Your code here
end tell
Ответ 4
Ничто из этого не похоже на скомпилированный AppleScript, сохраненный как приложение и помещенный в Dock. Всякий раз, когда вы запускаете приложение, IT - это самый передний, а не приложение, которое показывает его переднее окно. Это приложение становится неактивным, поскольку мой Applescript работает. Как написать приложение Applescript, которое не работает при запуске?
Возможно, я нашел решение проблемы, перечисленной выше. Просто попросите пользователя повторно активировать нужное приложение и дать им время.
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