在 PowerShell 中枚举文件属性

Posted

技术标签:

【中文标题】在 PowerShell 中枚举文件属性【英文标题】:Enumerate file properties in PowerShell 【发布时间】:2012-03-14 06:31:28 【问题描述】:

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

我是否使用了错误的函数(我所做的只是:Get-ItemProperty file)还是我必须以不同的方式执行此操作?

我希望能够说出诸如 $a += $file.Length 之类的内容,或者针对任意属性的类似内容。

【问题讨论】:

【参考方案1】:

听起来您正在寻找扩展文件属性。这些不存储在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:\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)

【讨论】:

.. 是一个运算符。它创建一个循环控制。所以0..287 表示从0 循环到287。所以在 ForEach-Object 块中(% 是它的别名),当前对象变量 $_ 将是 0,然后是 1,然后是 2...,直到它是 287。 我已经检查了所有这些属性.. 但我找不到上次修改的用户名.. 有什么属性或方法可以找到它吗?提前谢谢你。 在某些情况下可以超过 288 个。例如,您可以运行 0..500 来检查特定文件类型有多少属性。例如,mp4 似乎有直到 334 的属性。 对我来说它是 id 208。格式中有奇怪的空间..试图将其转换为日期时间...如果有人有解决方案? Windows 10 / 法语 试试这个找出id号 #for($i=0;$i -le 500;$i++) # $mCreated = $shellfolder.GetDetailsOf($shellfile, $i); # if($mCreated) # 写入主机 "$i + $mCreated" # #【参考方案2】:

另一种可能的方法,它也使用 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 method

Predefined Property Set Format Identifiers

【讨论】:

以上是关于在 PowerShell 中枚举文件属性的主要内容,如果未能解决你的问题,请参考以下文章

powershell 将属性添加到所有文件中的所有连接字符串

如何使用powershell从xml中获取属性值?

powershell 将本地文件的属性导出为CSV文件。

Powershell:根据逻辑驱动器名称或文件路径提取物理磁盘属性[重复]

powershell 将属性设置为每个用户配置文件(UPS)。

powershell 在-UPS-SharePoint中导出所有用户配置文件的已定义属性。