在 PowerShell 中枚举文件属性

问题描述 投票:0回答:2

我在其他问题中看到过一些这样的内容,但我正在寻找一种通用的方法来编写一个函数,该函数将接受一个文件,并以可以使用的方式列出其属性。我知道名为

Get-ItemProperty
的函数,但它没有列出我正在寻找的属性(例如,给定 .avi 文件,它不会告诉我长度、帧宽度等)。

我使用的函数是否错误(我所做的只是:

Get-ItemProperty file
)还是我必须以不同的方式执行此操作?

我希望能够对任意属性说出类似

$a += $file.Length
的内容。

powershell powershell-2.0
2个回答
22
投票

听起来您正在寻找扩展文件属性。这些不存储在

System.IO.FileInfo
中。

一种方法是使用

Shell.Application
COM 对象。这是一些示例代码:

http://web.archive.org/web/20160201231836/http://powershell.com/cs/blogs/tobias/archive/2011/01/07/organizing-videos-and-music.aspx

假设您有一个视频文件:C:ideo.wmv

$path = 'C:\video.wmv'
$shell = New-Object -COMObject Shell.Application
$folder = Split-Path $path
$file = Split-Path $path -Leaf
$shellfolder = $shell.Namespace($folder)
$shellfile = $shellfolder.ParseName($file)

您需要知道扩展属性的 ID 是什么。这将向您显示所有 ID:

0..287 | Foreach-Object { '{0} = {1}' -f $_, $shellfolder.GetDetailsOf($null, $_) }

一旦找到您想要的,您就可以像这样访问它:

$shellfolder.GetDetailsOf($shellfile, 216)

7
投票

另一种可能的方法也使用 Shell.Application COM 对象,但不需要您知道扩展属性的 ID 是什么。此方法优于使用 ID,因为不同版本的 Window(XP、Vista、10 等)中的 ID 不同

$FilePath = 'C:\Videos\Test.mp4'
$Folder = Split-Path -Parent -Path $FilePath
$File = Split-Path -Leaf -Path $FilePath
$Shell = New-Object -COMObject Shell.Application
$ShellFolder = $Shell.NameSpace($Folder)
$ShellFile = $ShellFolder.ParseName($File)

Write-Host $ShellFile.ExtendedProperty("System.Title")
Write-Host $ShellFile.ExtendedProperty("System.Media.Duration")
Write-Host $ShellFile.ExtendedProperty("System.Video.FrameWidth")
Write-Host $ShellFile.ExtendedProperty("System.Video.FrameHeight")

代码将显示视频的标题(如果已设置)、持续时间(100ns 单位,而不是毫秒)以及视频帧的宽度和高度。

其他扩展属性的名称可以在文件 propkey.h 中找到,该文件是 Windows SDK 的一部分。

附加信息:

ShellFolderItem.ExtendedProperty 方法

预定义属性集格式标识符

© www.soinside.com 2019 - 2024. All rights reserved.