在OS X上枚举所有已安装的应用程序

时间:2013-03-01 18:08:22

标签: macos osx-mountain-lion launch-services

基本问题

我正在寻找一个解决方案来枚举(Mac)OS X系统上安装的所有应用程序,即所有使用LaunchServices注册的应用程序包。

无效的简单方法

(请注意:lsregister下可以找到/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister

目前我正在使用lsregister -dump | grep -E '^.*[ \\t]*path:[ \\t]+(\/.*)$' | grep -Eo '\/.*'的输出,这有一些问题:

  • .app捆绑带换行符(\n,在UNIX上有效)未正确处理(通过编写正确的解析器可以解决此问题)
  • lsregister没有正确处理奇怪的文件名(例如包含RTL mark)。 lsregister似乎忽略了名称中带有RTL标记的文件。 如果需要,可以通过运行以下命令在名称中创建一个带RTL的文件。

    python -c 'import shutil; shutil.copytree(u"/Applications/TextEdit.app", u"/Applications/ThisIsAWeird\u202EApp.app")'
    

    执行此操作后,lsregister -dump | grep ThisIsAWeird显示它。但是,当您右键单击文本文件并转到"打开方式"你发现LaunchServices和Finder仍然支持该文件。 see yourself

简单地枚举/Applications和其他目录中的所有文件都不起作用,因为LaunchServices知道任意文件夹中的应用程序包,我也需要这些应用程序。

我没有去工作的其他approch

显然,有一个名为_LSFindApplications的私有API函数可以完成我需要做的事情,但是我无法让它工作,也没有找到任何关于该函数的非官方文档。互联网。 (证明它存在:nm /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/LaunchServices | grep __LSFindApplications$

更新:system_profiler方法似乎无法正常工作

直到现在我虽然@Anoop建议的system_profiler方法有效,但今天我发现lsregister仍然会获得更多的二进制文件。在所有计算机上都有一些或丢失,有些似乎只在system_profiler中只有在您安装了另外一个OS X的外部卷时才会丢失。这里列出了{输出中缺少的内容在我的一台机器上{1}}(但在system_profiler中出现):

lsregister

3 个答案:

答案 0 :(得分:4)

首先,您的请求不太正确:

  

我正在寻找一种解决方案来枚举(Mac)OS X系统上安装的所有应用程序,即所有使用LaunchServices注册的应用程序包。

那些不是一回事。在LaunchServices中注册的应用程序包是lsregister -dump的输出。这与“安装的所有应用程序”不同。 “所有已安装的应用程序”没有确切的查询。 OS X甚至没有这样的概念。

system_profiler的输出相当于Spotlight所知道的。这不完全是已安装应用程序的完整列表,在某些情况下可能不正确。例如,Spotlight可能已被禁用,或者它可能尚未完成第一次扫描。 (如果Spotlight已完成第一次扫描,则没有支持方式询问Spotlight;雷达15177626。)

还有pkgutil --pkgs可以为您提供额外的“已安装的东西”。它也不完整,可能列出未安装的东西。

您还可以使用mdfind遍历整个磁盘,并查看自称为应用程序的内容。这非常有效,但速度很慢。

您还可以使用locate .app | grep '\.app$',如果定位数据库是最新的并且您只需要应用程序包,这非常有效。

我在WWDC向Apple询问了这个问题。没有简单的,支持的答案。打开雷达。你可以要求欺骗15177489。

答案 1 :(得分:1)

如何使用Cocoa应用程序/代码完成here

此外,您可以使用system_profiler -xml SPApplicationsDataType然后解析生成的XML数据以获取您感兴趣的应用程序。

答案 2 :(得分:1)

在终端:

system_profiler SPApplicationsDataType > list_of_all_apps.txt

...将system_profiler查询的输出写入该文本文件。