【问题标题】:Batch set date time attribute according to the names of the files in a folder根据文件夹中文件的名称批量设置日期时间属性
【发布时间】:2012-04-01 14:26:19
【问题描述】:

感谢您的阅读和可能的回答。

我有一个文件夹,其中包含名为 yyyymmddhhMMss.m2ts 的文件,例如 20120330193059.m2ts。实际上,它们是索尼摄像机的输出,其中包含缺少元数据的额外文件。

为了使它们正确组织,我需要根据它们的文件名设置“创建日期”和“修改日期”文件属性,因为所有必要的数据都已经存在。

我完全远离任何类型的编程或编码,但我认为我可以使用我能找到的示例自己编译 .cmd。但现在我必须承认我失败了。

我知道我必须将文件名放入变量中,将此变量拆分为 6 个部分,然后将它们用作文件夹中每个文件的文件属性。但我不明白怎么做。

有很多关于如何根据时间戳重命名文件的示例,但反之则不然。

任何帮助将不胜感激。

【问题讨论】:

  • 将它们重命名为 2012-03-30_19-30-59 还不够吗?这很容易做到。
  • 不幸的是,不是。当您有成千上万的小视频片段并且需要使用自动创建的基于日历的菜单制作蓝光或 DVD 时(这是关键词,因为我会用手创建这样的菜单,直到我因如此数量的文件而悲伤地死去),您需要遵守母带软件的规则。索尼的 PMB 可以重新创建元数据,但只能根据创建日期和修改日期属性。没有别的了。
  • 我认为 Windows 命令行中没有任何可用的命令可以改变这一点。我现在已经浏览了整个列表,但我什么也没看到。在这种情况下,我认为没有一种简单的方法可以使用批处理文件来完成,或者根本就没有。我会寻找更多,但我认为这种方式不可行。
  • 也许您应该尝试寻找可以做到这一点的特殊软件。我认为您无法使用命令行命令访问这些属性字段。
  • 为什么不呢?为了获得 YEAR,我必须从文件名中删除最后 10 个字符。为了获得 MONTH,我必须修剪前 4 个和最后 8 个字符,依此类推。我认为对于任何具有 Windows shell 脚本语言基本知识的人来说,这都不难。希望他们能阅读本文并愿意提供帮助。

标签: batch-file


【解决方案1】:

您可以试试下面的批处理文件。先使用一组测试文件。

@echo off
setlocal EnableDelayedExpansion
set origDate=%date%
set origTime=%time%
for %%f in (*.*) do (
   set fName=%%~Nf
   set fDate=!fName:~4,2!/!fName:~6,2!/!fName:~0,4!
   set fTime=!fName:~8,2!:!fName:~10,2!:!fName:~12,2!
   REM Next line update just "Date Modified" in a fast way:
   REM echo !fDate!| date & echo !fTime!| time & copy "%%f" +,,
   REM Next 4 lines update both "Modified" and "Created" dates, but it is slower:
   echo !fDate!| date & echo !fTime!| time & copy "%%f" "%%~Nf.tmp"
   echo !fTime!| time & copy "%%~Nf.tmp" +,,
   del "%%f"
   ren "%%~Nf.tmp" "%%f"
)
echo %origDate%| date
echo %origTime%| time

此批处理文件要求您拥有足以更改系统时钟的凭据。假设echo %date% 以 MM/DD/YYYY 格式显示日期;如果不是,则需要稍作修改。如果要处理的文件数量很大,系统时钟可能会倒退几秒钟;也许您需要在批处理文件结束时手动重置系统时钟。

请报告结果。

编辑:我在上面的同一个清单中包含了两个部分(修改日期和创建日期)。

【讨论】:

  • 我之前的评论有点错误,如果您已经收到电子邮件通知,请忽略它。无论要更改的文件大小如何,您的批次几乎都可以立即完美地更改日期修改字段。所以非常感谢你,你为我节省了很多时间和冷静。我必须在批处理完成后更正时间,但 Windows 会自动完成,所以这根本不是问题。批处理的第二部分更改了上次访问的属性,而不是创建日期。
  • @Garfield:我测试了这种方法并且工作正常(使用一个文件)。请再次复制上面的程序,我已经修改以更新两个日期,并测试它。它必须正确更新两个日期;如果不是,则原因是错误,因为进程进入了FOR循环,可以解决。
  • 它再次更改 Modified 和 Accessed 但保持 Created 不变。无论如何,PMB 似乎只使用 Modified 属性来确定录制日期,所以不必担心 Created。你已经帮了我很多了。其实你做了我需要的一切。我对脚本几乎一无所知,但它可以工作并且没关系。再次感谢,你真的帮了很多忙。
猜你喜欢
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 2016-09-11
相关资源
最近更新 更多