答案1
根据在 PowerShell 中枚举文件属性帖子中,我创建了这个 PowerShell 逻辑的变体,并将其放入几个脚本中以协助完成任务。
我已经包含了循环逻辑、一些解析和条件逻辑,以及设置变量数据类型以协助获得最终的期望值。
笔记:我加入了条件逻辑来帮助从输出中省略空值。
电源外壳
设置$flPath
为文件的完整路径和文件名。设置$attrName
为元数据属性的属性名称以获取其值(例如“媒体创建”的日期时间)。
$flPath = "M:\Fortune500\Millionaires Club.mov";
$attrName = "media created"
$path = $flPath;
$shell = New-Object -COMObject Shell.Application;
$folder = Split-Path $path;
$file = Split-Path $path -Leaf;
$shellfolder = $shell.Namespace($folder);
$shellfile = $shellfolder.ParseName($file);
$a = 0..500 | % { Process { $x = '{0} = {1}' -f $_, $shellfolder.GetDetailsOf($null, $_); If ( $x.split("=")[1].Trim() ) { $x } } };
[int]$num = $a | % { Process { If ($_ -like "*$attrName*") { $_.Split("=")[0].trim() } } };
$mCreated = $shellfolder.GetDetailsOf($shellfile, $num);
$mCreated;
输出示例
12/31/2020 7:55 PM
PowerShell(目录中的所有文件)
设置$fldPath
为文件所在的目录,设置$flExt
为要搜索的文件类型的点扩展名,并设置$attrName
为元数据属性的属性名称以获取其值。
$fldPath = "M:\Fortune500";
$flExt = ".mov";
$attrName = "media created"
(Get-ChildItem -Path "$fldPath\*" -Include "*$flExt").FullName | % {
$path = $_
$shell = New-Object -COMObject Shell.Application;
$folder = Split-Path $path;
$file = Split-Path $path -Leaf;
$shellfolder = $shell.Namespace($folder);
$shellfile = $shellfolder.ParseName($file);
$a = 0..500 | % { Process { $x = '{0} = {1}' -f $_, $shellfolder.GetDetailsOf($null, $_); If ( $x.split("=")[1].Trim() ) { $x } } };
[int]$num = $a | % { Process { If ($_ -like "*$attrName*") { $_.Split("=")[0].trim() } } };
$mCreated = $shellfolder.GetDetailsOf($shellfile, $num);
$mCreated;
};
支持资源
- Folder.GetDetailsOf 方法
- ForEach 对象
标准别名对于 Foreach 对象:'
%
' 符号,ForEach - 如果()
- 分裂()
- 修剪()
答案2
以下是一些(未经测试的)示例代码:
$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.Media.Duration")
参考:
答案3
效果很好,而且比其他答案简单得多。
要获取创建日期,请使用:
Write-Host $ShellFile.ExtendedProperty("System.Media.**DateEncoded**")
...而不是System.Media.Duration
像例子中所示的那样。