此代码不适用于不存在的应用程序,因为它会提示用户查找"FooApp“(我不想与用户交互):
get exists application "FooApp"此代码仅适用于进程名称与其应用程序名称匹配的应用程序,该应用程序名称涵盖了大多数但不是所有应用程序:
tell application "System Events"
get exists application process "FooApp"
end tell(例如,在我的机器上,"OmniGraffle专业版“是进程名,但相应的应用程序名是"OmniGraffle专业版4”。)
发布于 2013-01-13 04:56:23
请注意,您的两个脚本做了不同的事情。第一个检查它是否在计算机上。第二个检查当前是否正在运行。因此,这里是如何做第一件事。
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-16 22:42:27
@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。您也可以在on error块中使用display alert (或者您想要的任何东西)。
对于你的第二个例子,你可以这样写:
tell application "System Events"
set processIsRunning to ((bundle identifier of processes) ¬
contains "com.bundle.id.here")
end tell它的功能与@Regus6633的代码几乎完全相同,只是获取进程列表并在一行中对其进行检查。你也不必担心初始化processIsRunning。
如果您使用的是应用程序名称,只需将bundle identifier替换为name即可。
发布于 2016-11-01 00:05:56
这是一个古老的问题,但答案可能仍然是有帮助的。以下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。
https://stackoverflow.com/questions/14297644
复制相似问题