问题
我正在尝试批量处理和整理一些旧视频文件。为了对文件进行分类,我想更新一些元数据,以便它能显示在我的目录软件中,阿贝梅达(又名neoFinder)。
在这种情况下,我正在从名称为的文件中解析出时间戳2000-12-24_18-56.00.mov
。
发现
我整天做了很多研究,发现了一些值得纪念的事情:
- 与图像不同,视频文件的元数据并不那么强大。要更新文件属性(例如时间戳),似乎最好的方法是在文件系统本身中进行更新。这是一种过于简单的说法,但归根结底,您并不总是拥有涵盖所有视频文件类型的通用元数据属性。
- 扩展工具是此类活动的常见建议,它能够从文件名中解析日期和时间,但它将结果数据保存在元数据属性中,对视频没有帮助(参见第 1 点)。它非常适合处理图像,但处理视频则比较繁琐。
- 例子:
exiftool "-createdate<filename" FILE
- 例子:
Exiftool
在进行这些更新时,它实际上会复制您的视频文件,因此如果您没有适当限制该命令,您的磁盘使用量实际上会翻倍。如果您正在处理高分辨率视频,即使只有一个文件也可能是一个问题。这也意味着它在批量处理视频时运行缓慢。- 您可以在 Powershell 中手动指定日期/时间属性。在此示例中,我抓取了当前目录中的所有 .mov 文件并将它们更改为相同的创建日期:
Get-ChildItem *.mov | ForEach-Object {$_.CreationTime="03/10/2001"}
请参阅我对这个主题的回答,了解如何更好地自动化此过程。
答案1
以下是根据文件名中的文本自动更新 CreationTime 的单行 powershell 脚本:
Get-ChildItem *.mov -Recurse | ForEach-Object {$_.CreationTime=[DateTime]::ParseExact($_.BaseName,'yyyy-MM-dd_HH-mm.ss',$null)}
解释
Get-ChildItem *.mov -Recurse
抓取当前目录和所有子文件夹中的所有文件(如果它们具有.mov
扩展名)| ForEach-Object {$_.CreationTime=...}
遍历找到的每个文件并更新文件的创建时间- 据推测,您可以用另一个时间戳代替
CreationTime
,例如LastWriteTime
或LastAccessTime
。
- 据推测,您可以用另一个时间戳代替
[DateTime]::ParseExact($_.BaseName,'yyyy-MM-dd_HH-mm.ss',$null)
是从文件名解析日期并将其传递回#2 中的属性的逻辑。- 从中间向外工作,
$_.BaseName
拉入文件名。 yyyy-MM-dd_HH-mm.ss
是文件名中写入的时间戳的格式,以便 powershell 知道它正在查看什么(这应该根据文本在文件中的显示方式进行调整)。[DateTime]::ParseExact
是从名称中解析该文本并将其转换为 powershell 可以使用的日期的命令。
- 从中间向外工作,
答案2
这是一个很好的解释。我是新手。从未使用过 PowerShell。我尝试了您的答案,但什么也没发生。PowerShell 中没有输出,也没有任何变化。
我的示例文件名.. 2001-04-12 04.45.33.m4v 我的示例脚本.. Get-ChildItem *.m4v -Recurse | ForEach-Object {$.CreationTime=[日期时间]::ParseExact($.BaseName,'yyyy-MM-dd HH.mm.ss',$null)
我做错了什么..我应该在目录提示符下运行它还是在出现>>时运行它。
如果我在目录中运行,运行后 epropt 会更改为 >>。
谢谢亚当