5

此代码不适用于不存在的应用程序,因为它会提示用户查找“FooApp”(并且我不想与用户交互):

get exists application "FooApp"

此代码仅适用于进程名称与其应用程序名称匹配的应用程序,它涵盖了大多数但不是所有应用程序:

tell application "System Events"
    get exists application process "FooApp"
end tell

(例如在我的机器上“OmniGraffle Professional”是一个进程名称,但对应的应用程序名称是“OmniGraffle Professional 4”。)

4

4 回答 4

5

@regulus6633正确地指出您在示例中做了两件不同的事情,而且他对捆绑标识符的建议也很到位。

我检查应用程序是否已安装的首选方法如下:

try
    tell application "Finder" to get application file id "bundle.id.here"
    set appExists to true
on error
    set appExists to false
end try

这避免了“应用程序 x 在哪里?” 对话框并为 appExists 分配一个布尔值。你也可以display alerton error街区(或任何你想要的东西)。

对于第二个示例,您可以编写:

tell application "System Events"
    set processIsRunning to ((bundle identifier of processes) ¬
    contains "com.bundle.id.here")
end tell

它几乎与@regulus6633 的代码完全一样,但获取进程列表并在一行中检查它。您也不必担心初始化 processIsRunning。

如果您使用应用程序名称,只需bundle identifier换成name.

于 2013-01-16T14:42:27.293 回答
4

请注意,您的 2 个脚本执行不同的操作。第一个检查它是否在计算机上。第二个检查它是否当前正在运行。所以这里是如何做第一件事。

set doesExist to false
try
    do shell script "osascript -e 'exists application \"foo\"'"
    set doesExist to true
end try

return doesExist

请注意,正如您所指出的,某些应用程序有多种名称。在这些情况下,您可以使用应用程序的捆绑包 ID 而不是它的名称。以下是如何获取 Safari 的 id 并使用它...

set appID to id of application "Safari"
exists application id appID

如果你想看看它是否正在运行,就像在你的第二个脚本中一样,你可以这样做......

set processIsRunning to true
tell application "System Events"
    set runningProcesses to processes whose bundle identifier is appID
end tell
if runningProcesses is {} then set processIsRunning to false
return processIsRunning
于 2013-01-12T20:56:22.870 回答
2

这是一个老问题,但答案可能仍然有帮助。以下 shell 脚本不会启动应用程序,避免出现“应用程序 x 在哪里?” 如果应用程序不存在,则对话框,接受应用程序名称或包 ID 作为输入,如果存在则返回应用程序的包 ID,如果不存在则返回空字符串:

set appBundleId to do shell script "osascript -e " & ("id of application \"" & appRef & "\"")'s quoted form & " || osascript -e " & ("id of application id \"" & appRef & "\"")'s quoted form & " || :"
set doesExist to (appBundleId ≠ "")

其中 appRef 是应用程序名称或包 ID。

于 2016-10-31T16:05:55.620 回答
0

如果您有两个具有相同捆绑标识符的应用程序,另一种方法是使用应用程序名称。例如,Adobe InDesign CS5.5 和 Adob​​e InDesign CS6 都有com.adobe.InDesign作为它们的包标识符。

tell application "System Events"
    name of every process contains ("Adobe Photoshop CS5.5")
end tell
于 2016-05-19T21:00:10.130 回答