gpt4 book ai didi

powershell - 是否可以获取不在 shell 命名空间中的项目的 shell 属性?

转载 作者:行者123 更新时间:2023-12-03 23:23:19 29 4
gpt4 key购买 nike

简洁版本

shell 如何获取文件的属性?

长版

Windows Shell 公开了关于 shell 命名空间中项目(例如文件和文件夹)的丰富属性系统。

例如:

  • System.Title : SQL Server Native Client OLE DB 到 ODBC 转换的快速指南
  • System.Author : George Yan (KW)
  • System.Document.LastAuthor : 罗汉尔
  • 系统评论 :要了解有关此演讲者的更多信息,查找其他 TEDTalks 并订阅此 Podcast 系列,请访问 www.TED.com 反馈:tedtalks@ted.com
  • System.ItemParticipants : George Yan (KW)
  • 系统公司 :Contoso
  • 系统语言 : 英语(美国)
  • System.Document.DateCreated : 6/‎10/‎2014 ‏‎5∶16∶30 ᴘᴍ
  • System.Image.Horizo​​ntalSize : 1845 像素
  • System.Image.VerticalSize : 4695 像素
  • System.Image.Horizo​​ntalResolution : 71 dpi
  • System.Image.VerticalResolution : 71 dpi

  • 为了让 shell 读取这些属性,它显然必须使用很多来源:
  • Windows Media Foundation IMFMetadata非常适合图像和电影
  • Windows 镜像组件 ( WIC ) 可能有很多用于读取元数据的 API
  • 我不确定 IFilter 可以检索职称 , 作者 , 主题 , 评论 等来自 Office 文档

  • 无论哪种方式,它都必须读取文件内容流并对文件的内容进行处理才能获得所有这些花哨的 shell 属性。换句话说:
    IStream  \
    + |--> [magic] --> IPropertyStore
    .ext /

    可以与我自己的流一起使用吗?

    我有不在 shell 命名空间中的项目;它们在数据存储中。我确实通过 IDataObject 将它们暴露在 shell 中。作为 CF_FILEDESCRIPTOR IStream 何时执行复制粘贴或拖放。但除此之外,它们只是数据存储中的可流式 blob。

    我希望能够利用非常有才华和勤奋的 1 所做的所有现有工作shell 团队从"file"中读取元数据,该文件最终仅作为 IStream 存在.

    是否有一个绑定(bind)上下文选项可以让我获得基于 IDataObject 的属性存储?而不是 IShellItem2 ?

    所以而不是:
    IPropertyStore ps = shellItem2.GetPropertyStore();

    有没有:
    IPropertyStore ps = GetShellPropertiesFromFileStream(stream);

    ?

    shell 如何获取文件的所有属性?

    奖金聊天 - IPropertyStoreFactory

    This interface is typically obtained through IShellFolder::BindToObject or IShellItem::BindToHandler. It is useful for data source implementers who want to avoid the additional overhead of creating a property store through IShellItem2::GetPropertyStore. However, IShellItem2::GetPropertyStore is the recommended method to obtain a property store unless you are implementing a data source through a Shell folder extension.



    试过了
    IPropertyStore ps = CoCreateInstance(CLSID_PropertyStore);
    IInitializeWithStream iws = ps.QueryInterface(IID_IInitializeWithStream);

    但是 CLSID_PropertyStore不支持 IInitializeWithStream .

    奖金阅读
  • MSDN:Initializing Property Handlers

    Property handlers are a crucial part of the property system. They are invoked in-process by the indexer to read and index property values, and are also invoked by Windows Explorer in-process to read and write property values directly in the files.

  • MSDN:Registering and Distributing Property Handlers (拼写注册表以获得乐趣并从另一方阅读契约(Contract))
  • 最佳答案

    (在 Property Store 处理程序方面有一些经验)我如何看待解决方案:

  • 获取文件扩展名的 PropertyStore 处理程序 CLSID。您应该使用 2 个 regkeys key :
  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\PropertySystem\PropertyHandlers\.yourext
  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\PropertySystem\SystemPropertyHandlers
  • 使用 CoCreateInstance
  • 创建两个对象
  • 如果您有 2 个对象,您可以使用 将它们组合成单个对象PSCreateMultiplexPropertyStore
  • 查询 IInitializeWithStream (也可以尝试查询 IPersistStream )。

  • 如果 PropertyStore 对象支持 IinitializeWithStream / IPersistStream :你很幸运——只需初始化你的对象并查询你需要的属性。如果没有 - 您仍然有(脏)变体来创建临时文件,然后使用 IPersistFile .

    关于powershell - 是否可以获取不在 shell 命名空间中的项目的 shell 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55463067/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com