You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为多个文件/目录打开单个Finder「显示简介」窗口?

如何通过代码为多个本地URL打开Finder单个「检查器」窗口(对应Cmd+Option+I效果)

我当前的代码会为每个URL打开单独的「显示简介」窗口,效果等同于按下Cmd+I:

func openGetInfoWnd(for urls: [URL]) {
    let pBoard = NSPasteboard(name: NSPasteboard.Name(rawValue: "pasteBoard_\(UUID().uuidString )") )
    
    pBoard.writeObjects(urls as [NSPasteboardWriting])
    
    NSPerformService("Finder/Show Info", pBoard)
}

我需要实现的是像按下Cmd+Option+I那样,为选中的多个本地URL打开单个「多项目信息」检查器窗口。尝试使用NSPerformService("Finder/Show Inspector", pBoard)但没有效果。


解决方案:使用AppleScript控制Finder

直接通过NSPerformService无法实现该效果,改用AppleScript模拟手动操作是更可靠的方式,以下是Swift代码实现:

func openMultiItemInspector(for urls: [URL]) {
    // 将URL转换为Finder可识别的POSIX路径格式
    let paths = urls.map { $0.path }.map { "\"\($0)\"" }.joined(separator: ", ")
    
    // 构建AppleScript脚本
    let script = """
        tell application "Finder"
            set selectedItems to { \(paths) } as alias list
            set selection to selectedItems
            activate
            tell application "System Events" to keystroke "i" using {command down, option down}
        end tell
        """
    
    // 执行脚本
    var error: NSDictionary?
    if let scriptObject = NSAppleScript(source: script) {
        scriptObject.executeAndReturnError(&error)
        if let error = error {
            print("执行错误: \(error)")
        }
    }
}

代码说明

  • 先把URL转为AppleScript能识别的别名路径格式,让Finder选中目标文件
  • 模拟按下Cmd+Option+I快捷键,完全还原手动操作的效果,确保打开单个检查器窗口

无快捷键模拟的替代方案:使用Accessibility API

如果不想依赖快捷键,可以通过系统辅助功能API直接控制Finder:

import ApplicationServices

func openMultiItemInspectorAX(for urls: [URL]) {
    // 获取Finder进程ID
    guard let finderPID = NSWorkspace.shared.runningApplications.first(where: { $0.bundleIdentifier == "com.apple.finder" })?.processIdentifier else {
        print("Finder未运行")
        return
    }
    let finderElement = AXUIElementCreateApplication(finderPID)
    
    // 设置Finder选中的文件列表
    let paths = urls.map { $0.path as CFString }
    var selectedFiles: CFArray = paths as CFArray
    AXUIElementSetAttributeValue(finderElement, kAXSelectedChildrenAttribute as CFString, &selectedFiles)
    
    // 触发打开检查器的动作
    AXUIElementPerformAction(finderElement, kAXShowInspectorAction as CFString)
}

注意:使用该方案需要在项目Info.plist中添加NSAppleEventsUsageDescription和NSAccessibilityUsageDescription权限描述,并且用户需要在系统偏好设置的「安全性与隐私」→「隐私」→「辅助功能」中授予应用权限。

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:23:17