windows - 复制文件后更新“创建日期”
问题描述
我最近使用 iCloud for Windows (10) 将所有图片从 iCloud 下载到我的本地机器上。然后我想创建一个备份,所以我将所有(15'000)张图片复制粘贴到外部硬盘上。
我注意到由于复制粘贴操作,“创建日期” - 事后看来显然 - 从拍摄照片的日期更改为复制操作的日期/时间。
自复制操作以来,在我注意到日期更改之前,我已经花费了很多时间将图片放入子文件夹等。我现在想将原始日期/时间放回元数据中。
我的想法是制作 iCloud 原始档案的目录,返回文件名、md5 哈希和创建日期。然后我想编写一个脚本(Powershell?)在我的子文件夹中找到匹配的文件,并更新日期。
几个问题:
- 这似乎是最好的方法吗?
- 将来有没有更好的方法来复制照片,保留原始创建日期?
任何对正确方向的帮助,无论这对于 Powershell 是否是一个好主意,都将不胜感激。
解决方案
使用 PowerShell 手动更改时间戳
要使用 PowerShell 更改创建日期、修改日期和访问日期文件属性,我建议在此处查看此网站。它解释了如何更改单个文件、给定文件夹中的所有文件甚至文件夹本身的创建/修改/访问日期文件属性。例如:
对于单个文件:
要将“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")
同样,要设置date modified,您可以编写:
(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 命令的文档。您只需通过命令提示符运行程序(具有管理员权限)。
根据您的需要,假设您在位于 的“原始”文件夹中有原始形式的图像和视频(具有所有正确时间戳的图像和视频等)"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文档页面上进行了详细解释,但我也会在这里进行解释。
- 第一个参数指定源文件夹的路径。请注意,后面没有反斜杠!如果最后包含反斜杠,
robocopy
将无法理解输入。 - 第二个参数指定目标文件夹的路径。
- 第三个参数实际上可以是多个参数。在这里,
*.*
指定要复制的文件。由于支持通配符(* 或?),*.*
匹配源目录中的所有文件(即,所有内容都将被复制)。*.*
是默认参数,所以如果你想复制所有文件,你甚至不需要指定这个参数。如果你想复制所有以 . 结尾的文件.jpg
,你会写*.jpg
. 或者,如果你想复制,比如说,只有两个文件file1.jpg
,file2.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
复制子目录。此选项自动包括空目录。 /copy:DAT
指定要复制的文件属性。在这里,D
、A
和T
表示将复制文件的数据、属性和时间戳属性。有关详细信息,请参阅 robocopy 的文档。/dcopy:DAT
与文件夹相同/copy:DAT
。/mt:16
创建具有 16 个线程的多线程副本。您可以指定 1 到 128 之间的整数。/j
使用无缓冲 I/O 复制(推荐用于大文件)。/xjd
不包括目录的连接点。/xa:s
不包括“系统”文件。/r:1
指定失败副本的重试次数。在这里,它设置为 1。默认值为 1,000,000(一百万次重试)!/w:0
指定重试之间的等待时间,以秒为单位。在这里,它设置为 0,所以 0 秒用于等待。/log:"filename_path.txt"
将状态输出写入日志文件。
推荐阅读
- azure-devops - 如何获取有关 Azure Devops 使用情况的统计信息?
- sql - Oracle Live SQL 不允许多行插入
- spring-kafka - 将 spring-kafka 更新到 2.4.0.RELEASE 时获取“java.lang.ClassNotFoundException:org.springframework.core.log.LogAccessor”
- r - 如何通过添加两列并赋予其中一个优先级来创建新列?
- javascript - 没有这个的另一个函数内部调用的函数上下文是什么?
- sql-server - Azure 数据库上的慢查询操作
- python - 如果任何数字是英镑,我如何从该输出中获得平均值并将货币转换为欧元?
- java - 为什么我有数组 [] 选项作为构造函数调用?
- rxjs - 等待 Observable 在 Array.Map 内部完成
- botframework - 有什么方法可以知道 Bot Activity 响应是否是最终响应?