【问题标题】:Get file type description for file extensions获取文件扩展名的文件类型描述
【发布时间】:2014-12-25 09:14:57
【问题描述】:

我对磁盘上的数据使用情况进行了报告,我从所有选定的属性中获取信息,例如名称、路径、大小……代表一个文件描述,对于每个扫描的文件,此属性为空。例如,当您在 Windows 资源管理器中选择文件并在常规选项卡中选择属性时,您可以看到“文件类型”,此处对于 Excel 文件,文件类型为“Microsoft Excel 工作表 (.xlsx)”。

gci c:\file | select *

我怎样才能得到这些信息?

【问题讨论】:

  • 该信息不在文件中,而是由 Shell 提供。在常规开发语言中,人们会使用SHGetFileInfo Shell 函数来检索该信息,但我终其一生都无法将其移植到 powershell。一个好的开始是this question

标签: powershell file-association


【解决方案1】:

我喜欢尽可能避免使用外部程序,所以我建议使用注册表。

$ext = ".xlsx"   
$desc = (Get-ItemProperty "Registry::HKEY_Classes_root\$((Get-ItemProperty "Registry::HKEY_Classes_root\$ext")."(default)")")."(default)"
$desc

Microsoft Excel-regneark   #Norwegian description

要将它与Select-Object 一起使用,您可以像这样修改它:

#You could define this inside Select-Object too, but it's a bit long so I extracted it first to clean up the code.
$extensiondesc = @{n="ExtensionDescription";e={ (Get-ItemProperty "Registry::HKEY_Classes_root\$((Get-ItemProperty "Registry::HKEY_Classes_root\$($_.Extension)")."(default)")")."(default)" }}

Get-ChildItem |
Select-Object Extension, $extensiondesc

Extension ExtensionDescription
--------- --------------------
.oxps     XPS Document
.lnk      Shortcut
.txt      Text Document 

【讨论】:

    【解决方案2】:

    假设$ext 具有文件的扩展名。

    例如-

    $ext = ".bmp"
    

    如果已注册,以下代码将为您提供描述(如果适合您的场景,您应该添加更好的错误处理)-

    $desc = (cmd /c assoc $ext).Split("=")[1]
    $desc = (cmd /c assoc $desc).Split("=")[1]
    
    Write-Host $desc
    

    AFAIK,Powershell 没有任何内置机制来获取此信息,因此使用 powershell 中的 cmd 是最便宜和最简单的解决方案恕我直言。

    【讨论】:

    • assoc - 现在回忆起来了!不错。
    • 感谢您的回复,这也是一个有趣的解决方案。
    【解决方案3】:

    您可以使用Shell.Application 对象的GetDetailsOf() 方法:

    $app = New-Object -COM 'Shell.Application'
    
    $f   = Get-Item 'C:\path\to\your\file'
    $dir = $app.NameSpace($f.Directory.FullName)
    
    $description = $dir.GetDetailsOf($dir.ParseName($f.Name), 2)
    

    【讨论】:

      【解决方案4】:

      我刚刚对 Frode F 的解决方案进行了即兴创作,添加了一个带有唯一条目的排序列表,以使其更易于阅读。

      $extensiondesc = @{n="ExtensionDescription";
      e={(Get-ItemProperty "Registry::HKEY_Classes_root\$((Get-ItemProperty "Registry::HKEY_Classes_root\$($_.Extension)")."(default)")")."(default)" }}
      Get-ChildItem |
      Select-Object -unique Extension, $extensiondesc |Sort-Object @{e="Extension";Ascending=$true},@{e="ExtensionDescription";Ascending=$false} 
      

      【讨论】:

        猜你喜欢
        • 2011-04-16
        • 2011-06-04
        • 1970-01-01
        • 2019-02-06
        • 2013-05-28
        • 2010-11-05
        • 2011-07-24
        相关资源
        最近更新 更多