此代码不适用于不存在的应用,因为它会提示用户查找“FooApp”(并且我不想与用户进行交互):
get exists application "FooApp"
此代码仅适用于进程名称与其应用程序名称相匹配的应用程序,该应用程序名称涵盖大多数但不是所有应用程序:
tell application "System Events"
get exists application process "FooApp"
end tell
(例如在我的机器上“OmniGraffle Professional”是一个进程名称,但相应的应用程序名称是“OmniGraffle Professional 4”。)
答案 0 :(得分: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
答案 1 :(得分:3)
@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
这避免了“Where is application x?”对话框并为appExists分配一个布尔值。您也可以在display alert
区块中on error
(或您想要的任何内容)。
对于你的第二个例子,你可以写:
tell application "System Events"
set processIsRunning to ((bundle identifier of processes) ¬
contains "com.bundle.id.here")
end tell
它几乎完全符合@ regulus6633的代码,但抓取进程列表并在一行中进行检查。您也不必担心初始化processIsRunning。
如果您使用的是应用名称,请将bundle identifier
换成name
。
答案 2 :(得分:0)
另一种方法是,如果您有两个具有相同包标识符的应用程序,则使用应用程序名称。例如,Adobe InDesign CS5.5和Adobe InDesign CS6都有com.adobe.InDesign
作为其捆绑标识符。
tell application "System Events"
name of every process contains ("Adobe Photoshop CS5.5")
end tell
答案 3 :(得分:0)
这是一个老问题,但答案可能仍然有用。以下shell脚本没有启动应用程序,避免了"应用程序x在哪里?"对话框,如果应用程序不存在,接受应用程序名称或包ID作为输入,并返回应用程序的包ID(如果存在)或空字符串,如果它不是:
kind
其中appRef是应用程序名称或包ID。