通过解析文件名文本批量编辑文件属性

通过解析文件名文本批量编辑文件属性

问题

我正在尝试批量处理和整理一些旧视频文件。为了对文件进行分类,我想更新一些元数据,以便它能显示在我的目录软件中,阿贝梅达(又名neoFinder)。

在这种情况下,我正在从名称为的文件中解析出时间戳2000-12-24_18-56.00.mov

发现

我整天做了很多研究,发现了一些值得纪念的事情:

  1. 与图像不同,视频文件的元数据并不那么强大。要更新文件属性(例如时间戳),似乎最好的方法是在文件系统本身中进行更新。这是一种过于简单的说法,但归根结底,您并不总是拥有涵盖所有视频文件类型的通用元数据属性。
  2. 扩展工具是此类活动的常见建议,它能够从文件名中解析日期和时间,但它将结果数据保存在元数据属性中,对视频没有帮助(参见第 1 点)。它非常适合处理图像,但处理视频则比较繁琐。
    • 例子:exiftool "-createdate<filename" FILE
  3. Exiftool在进行这些更新时,它实际上会复制您的视频文件,因此如果您没有适当限制该命令,您的磁盘使用量实际上会翻倍。如果您正在处理高分辨率视频,即使只有一个文件也可能是一个问题。这也意味着它在批量处理视频时运行缓慢。
  4. 您可以在 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)}

解释

  1. Get-ChildItem *.mov -Recurse抓取当前目录和所有子文件夹中的所有文件(如果它们具有.mov扩展名)
  2. | ForEach-Object {$_.CreationTime=...}遍历找到的每个文件并更新文件的创建时间
    • 据推测,您可以用另一个时间戳代替CreationTime,例如LastWriteTimeLastAccessTime
  3. [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 会更改为 >>。

谢谢亚当

相关内容