在PowerShell中枚举文件属性

soa*_*dos 5 powershell powershell-2.0

我在其他问题中已经看到了这些,但我正在寻找一种通用的方法来编写一个将获取文件的函数,并以可以使用它们的方式列出其属性.我知道调用的函数,Get-ItemProperty但它没有列出我正在寻找的属性(例如,给定.avi文件,它不会告诉我长度,帧宽等).

我使用的功能是错误的(我正在做的是:) Get-ItemProperty file或者我必须以不同的方式做这个吗?

我希望能够说出$ a + = $ file.Length之类的东西,或类似于任意属性的东西.

And*_*ndi 13

听起来你正在寻找扩展文件属性.这些不存储在System.IO.FileInfo.

一种方法是使用Shell.ApplicationCOM对象.这是一些示例代码:

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

假设你有一个视频文件: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)
Run Code Online (Sandbox Code Playgroud)

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

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

一旦找到了你想要的那个就可以像这样访问它:

$shellfolder.GetDetailsOf($shellfile, 216)
Run Code Online (Sandbox Code Playgroud)

  • `..`是一个运营商.它创建了一个循环控件.所以`0..287`表示从'0`到'287`的循环.所以在ForEach-Object块中('%`是它的别名),当前对象变量`$ _`将为0然后是1然后是2 ......直到它为287. (2认同)
  • 在某些情况下可能会超过 288 个。例如,您可以运行 0..500 来检查特定文件类型有多少个属性。例如,mp4 似乎具有直到 334 的属性。 (2认同)

小智 6

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

\n
$FilePath = \'C:\\Videos\\Test.mp4\'\n$Folder = Split-Path -Parent -Path $FilePath\n$File = Split-Path -Leaf -Path $FilePath\n$Shell = New-Object -COMObject Shell.Application\n$ShellFolder = $Shell.NameSpace($Folder)\n$ShellFile = $ShellFolder.ParseName($File)\n\nWrite-Host $ShellFile.ExtendedProperty("System.Title")\nWrite-Host $ShellFile.ExtendedProperty("System.Media.Duration")\nWrite-Host $ShellFile.ExtendedProperty("System.Video.FrameWidth")\nWrite-Host $ShellFile.ExtendedProperty("System.Video.FrameHeight")\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

附加信息:

\n

ShellFolderItem.ExtendedProperty 方法

\n

预定义属性集格式标识符

\n