我在其他问题中已经看到了这些,但我正在寻找一种通用的方法来编写一个将获取文件的函数,并以可以使用它们的方式列出其属性。我知道名为Get-ItemProperty
的函数,但它没有列出我正在寻找的属性(例如,给定.avi文件,它不会告诉我长度,帧宽等)。
我是否使用了错误的功能(我所做的只是:Get-ItemProperty file
)或者我是否必须以不同的方式执行此操作?
我希望能够说出$ a + = $ file.Length之类的内容,或类似任意属性的内容。
答案 0 :(得分:12)
听起来您正在寻找扩展文件属性。这些不存储在System.IO.FileInfo
。
一种方法是使用Shell.Application
COM对象。以下是一些示例代码:
假设你有一个视频文件:C:\ video.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)
答案 1 :(得分:1)
另一种可能的方法也使用 Shell.Application COM 对象,但不需要您知道扩展属性的 ID 是什么。这种方法比使用 ID 更受欢迎,因为 ID 在不同版本的 Window(XP、Vista、10 等)中是不同的
$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 的一部分。
其他信息: