【问题标题】:Updating "Date Created" after copying files复制文件后更新“创建日期”
【发布时间】:2020-08-23 10:12:12
【问题描述】:

我最近使用 iCloud for Windows (10) 将所有图片从 iCloud 下载到我的本地计算机上。然后我想创建一个备份,所以我将所有 (15'000) 张图片复制粘贴到了外部硬盘上。

我注意到,由于复制粘贴操作,“创建日期”(事后看来很明显)已从拍摄照片的日期更改为复制操作的日期/时间。

自从复制操作以来,在我注意到日期更改之前,我已经花费了很多时间将图片放入子文件夹等。我现在想将原始日期/时间放回元数据中。

我的想法是制作一个 iCloud 原始档案的目录,返回文件名、md5 哈希和创建日期。然后我想编写一个脚本(Powershell?)在我的子文件夹中找到匹配的文件,并更新日期。

几个问题:

  1. 这似乎是最好的方法吗?
  2. 以后有没有更好的方法来复制照片,保留原来的创建日期?

无论这对于 Powershell 是否是一个好主意,对正确方向的任何帮助,将不胜感激。

【问题讨论】:

  • 至少在 Windows 中的同驱动器文件副本上,副本将保留原始文件的修改时间(PowerShell/.NET 中的LastWriteTime 属性),但创建时间(CreationTime 属性)得到设置为当前时间。你确定这不是这里发生的事情吗?或者你说它改变的不是属性而是文件本身的(EXIF?)标签?您说您将照片“下载到我的本地计算机上”,然后将它们备份到“外部硬盘上”,那么复制是通过 iCloud → 本地驱动器 → 外部驱动器,还是 iCloud → 外部驱动器?时间戳在哪个位置更改?
  • 另外,您使用什么来确定时间戳已更改?探险家?如果我打开 JPEG 文件的属性并选择Details 选项卡,在Origin 部分下有一个Date taken 值,在File 部分下有Date createdDate modified 值;所有三个值都相同。如果我复制并粘贴该照片并查看其DetailsDate created 值已更改为当前时间。 File 部分中的所有内容都来自 文件系统,而不是特定于格式的元数据,因此根据我之前的评论,预计会发生变化。
  • 我也在使用资源管理器。我已经下载了“iCloud for Windows”——它将你的 iCloud 照片下载到指定的目录(在我的例子中是 C:\Users\pr0no\iCloud,因为这是我在 iCloud 应用程序中选择的目录)。如果我看一张图片:Properties > Details > Origin,那么所有这些字段都是空的。但是,在Properties > Details > File 下,我看到Date Created 08/12/2016 14:22(照片拍摄的实际日期/时间)和Date Modified 05/05/2020 13:17(iCloud 应用程序将照片下载到我的本地计算机的时间)。
  • 但是如果我现在将CTRL-C CTRL-V 这张照片放到另一个文件夹在同一个磁盘上(我之前说我复制到外部磁盘上是错误的),那么@987654338 @ 更新到CTRL-V 的时间,但我想保留这个Date Created。在Properties > Details > Advanced Photo 它说EXIF version 0221 但所有其他元数据(除了前面提到的File 属性外,都是空的。所以我想,同样根据你的评论,这种行为是预期的,但我的问题是:为什么原始 iCloud 下载从 2016 年开始使用 Date Created 写入文件?
  • 说了这么多,我不认为您的重要时间戳已更改,因此无需修复。这只是文件 attributes 中的时间戳和文件 data 中的时间戳之间的差异的问题。所有这一切的一个警告是除非当您说“我现在想将原始日期/时间放回元数据”时,“原始日期/时间”文件属性时间戳,并且从未嵌入(我假设为JPEG)时间戳。那会很糟糕,因为我不希望在像这样跨越系统时保留属性时间戳。

标签: windows powershell icloud


【解决方案1】:

使用 PowerShell 手动更改时间戳

要使用 PowerShell 更改创建日期、修改日期和访问日期文件属性,我建议您查看此网站 here。它解释了如何更改单个文件、给定文件夹中的所有文件甚至文件夹本身的创建/修改/访问日期文件属性。例如:

对于单个文件:

要将“filename.txt”的创建日期时间设置为 2012 年 12 月 5 日晚上 9:57:05,您可以这样写:

(Get-Item "C:\Users\Path_to_file\filename.txt").creationtime=$(Get-Date "05/12/2012 21:57:05")

同样,要设置修改日期,您可以这样写:

(Get-Item "C:\Users\Path_to_file\filename.txt").lastwritetime=$(Get-Date "05/12/2012 21:57:05")

对于访问日期时间:

(Get-Item "C:\Users\Path_to_file\filename.txt").lastaccesstime=$(Get-Date "05/12/2012 21:57:05")

您可以将属性设置为其他属性。例如: 要将创建日期设置为等于修改日期,您可以这样写:

(Get-Item "C:\Users\Path_to_file\filename.txt").creationtime=$(Get-Item "C:\Users\Path_to_file\filename.txt").lastwritetime

对于名为“Test”的文件夹中的所有文件:

Get-ChildItem -force 'C:\Users\Path_to_folder\Test\' * | ForEach-Object{$_.CreationTime = ("3 August 2019 17:00:00")}
Get-ChildItem -force 'C:\Users\Path_to_folder\Test\' * | ForEach-Object{$_.LastWriteTime = ("3 August 2019 17:10:00")}
Get-ChildItem -force 'C:\Users\Path_to_folder\Test\' * | ForEach-Object{$_.LastAccessTime = ("3 August 2019 17:10:00")}

请注意,-force 参数可确保隐藏文件也包含在内。另外,请记住,如果您想将每张图片的时间戳更改为其自己对应图像的时间戳(即,如果您想智能地自动化该过程),您需要编写一个脚本来处理每个单独的案例。


复制文件同时保留时间戳(等等)

使用最简单的工具是 Windows 自己的内置工具:robocopy。请参阅 Microsoft 关于 robocopy 命令 here 的文档。您只需通过命令提示符运行程序(具有管理员权限)。

根据您的需要,假设您在位于"C:\Users\Person\Desktop\Original" 的“原始”文件夹中拥有原始形式的图像和视频(具有所有正确时间戳的图像和视频等),并且您想要复制所有这些图像和视频都保存到位于外部硬盘驱动器上的文件夹中,地址为 "D:\Pictures\Copied"。以下命令可能效果最好:

robocopy "C:\Users\Person\Desktop\Original" "D:\Pictures\Copied" *.* /e /copy:DAT /dcopy:DAT /mt:16 /j /xjd /xa:s /r:1 /w:0 /log:"filename_path.txt"

每个参数在 Microsoft 的 robocopy 文档页面上都有详细解释,但我也会在这里解释。

  1. 第一个参数指定源文件夹的路径。请注意,后面没有反斜杠!如果您在末尾包含反斜杠,robocopy 将无法理解输入。
  2. 第二个参数指定目标文件夹的路径。
  3. 第三个参数实际上可以是多个参数。这里,*.* 指定要复制的文件。由于支持通配符(* 或 ?),*.* 匹配源目录中的 所有 文件(即,所有内容都将被复制)。 *.*是默认参数,所以如果你想复制所有文件,你甚至不需要指定这个参数。如果你想复制所有以.jpg 结尾的文件,你可以写*.jpg。或者,如果您只想复制两个文件 file1.jpgfile2.mp4,您需要明确地写出它们,一个接一个,例如 robocopy "C:\Users\Person\Desktop\Original" "D:\Pictures\Copied" file1.jpg file2.mp4 /e /copy:DAT /dcopy:DAT /mt:16 /j /xjd /xa:s /r:1 /w:0 /log:"filename_path.txt"
  4. 第四个参数/e 复制子目录。此选项自动包含空目录。
  5. /copy:DAT 指定要复制的文件属性。这里,DAT 表示将复制文件的数据、属性和时间戳属性。有关详细信息,请参阅 robocopy 的文档。
  6. /dcopy:DAT/copy:DAT 相同,但文件夹除外。
  7. /mt:16 创建具有 16 个线程的多线程副本。您可以指定 1 到 128 之间的整数。
  8. /j 使用无缓冲 I/O 进行复制(推荐用于大文件)。
  9. /xjd 不包括目录的连接点。
  10. /xa:s 不包括“系统”文件。
  11. /r:1 指定失败副本的重试次数。这里设置为 1。默认值为 1,000,000(一百万次重试)!
  12. /w:0 指定重试之间的等待时间,以秒为单位。在这里,它设置为 0,因此等待时间为 0 秒。
  13. /log:"filename_path.txt" 将状态输出写入日志文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 2013-05-11
    • 2017-01-29
    • 2018-05-13
    • 2020-05-12
    相关资源
    最近更新 更多