在 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:根据逻辑驱动器名称或文件路径提取物理磁盘属性[重复]