我在其他问题中看到过一些这样的内容,但我正在寻找一种通用的方法来编写一个函数,该函数将接受一个文件,并以可以使用的方式列出其属性。我知道名为
Get-ItemProperty
的函数,但它没有列出我正在寻找的属性(例如,给定 .avi 文件,它不会告诉我长度、帧宽度等)。
我使用的函数是否错误(我所做的只是:
Get-ItemProperty file
)还是我必须以不同的方式执行此操作?
我希望能够对任意属性说出类似
$a += $file.Length
的内容。
听起来您正在寻找扩展文件属性。这些不存储在
System.IO.FileInfo
中。
一种方法是使用
Shell.Application
COM 对象。这是一些示例代码:
假设您有一个视频文件: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)
另一种可能的方法也使用 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 的一部分。
附加信息: