Я пытаюсь сделать скрипт (между прочим), должен знать, запущено ли определенное приложение.Для максимальной надежности я бы хотел найти его по пути к файлу.Или, если это не удалось, найдите его по имени или идентификатору пакета и проверьте его путь к файлу.Просто чтобы усложнить ситуацию, у меня есть путь к приложению в форме POSIX
. Я хочу сделать что-то вроде этого ( с использованием TextEdit в качестве примера здесь )
tell application "System Events"
item 1 of (processes whose application file is "/Applications/TextEdit.app")
end tell
Но это не работает ...
Я не гений AppleScript, но я обнаружил, что я могу по крайней мере найти работающий процесс по его идентификатору пакета, а затем получить его файл как бесполезный "псевдоним ":
tell application "System Events"
application file of item 1 of (processes whose bundle identifier is "com.apple.TextEdit")
end tell
Я получаю alias Macintosh HD:Applications:TextEdit.app:
Отлично, только я ни с чем не могу это сравнить!Я даже не могу перевести этот application file
-alias в путь POSIX и сравнить их как строки.Также я не могу перевести путь POSIX, который у меня есть, в псевдоним, а затем сравнить.
Итак, что мне делать?
Обновление / решение
Шляпные подсказки ПолуR и regulus6633 за полезные советы!
Наверное, мне следовало быть немного более конкретным.Как я пишу в некоторых комментариях ниже, выяснить, работает ли an, когда у вас есть только его путь, не все, что должен делать скрипт.Дело в том, чтобы на самом деле найти процесс, который соответствует пути, а затем выполнить некоторые сценарии GUI.Т.е. я не могу использовать простой ps
, потому что мне нужен доступ к GUI / AppleScript (особенно к окнам процесса).
Я мог бы технически сделать ps
, чтобы получить PID (как regulus6633).предложено ниже), но AppleScript уже работает в оболочке, порожденной скриптом Ruby, запущенным в другой оболочке, и это просто показалось грязным.
Закончилось это делать (что кажется много, но это было необходимов контексте того, что я делал):
on getProcessByPOSIXPath(posixPath, bundleID)
-- This file-as-alias seems really complex, but it's an easy way to normalize the path endings (i.e. trailing slash/colon)
set pathFile to (POSIX file posixPath) as alias
set thePath to pathFile as text
tell application "System Events"
repeat with activeProcess in (processes whose bundle identifier is bundleID)
try
set appFile to application file of activeProcess
if (appFile as text) is equal to thePath then return activeProcess
end try
end repeat
return null
end tell
end getProcessByPOSIXPath
Обратите внимание, что аргумент posixPath
должен быть путем к пакету приложения (например, "/Applications/TextEdit.app/" с или без завершающей косой черты), а не фактический исполняемый файл внутри пакета.
Функция вернет процесс, соответствующий заданному пути POSIX (или пустому, если он не найден)
Аргумент bundleIdentifier
необязателен, ноэто ускоряет все много , сужая список процессов.Если вы хотите, чтобы это работало, просто используя путь, вы можете сделать это
on getProcessByPOSIXPath(posixPath)
set pathFile to (POSIX file posixPath) as alias
set thePath to pathFile as text
tell application "System Events"
repeat with activeProcess in processes
try
set appFile to application file of activeProcess
if (appFile as text) is equal to thePath then return activeProcess
end try
end repeat
return null
end tell
end getProcessByPOSIXPath