背景信息
2003 年至 2013 年期间,我习惯将重要电子邮件从电子邮件帐户保存到本地硬盘上作为*.eml
文件。(我不再这样做了,因为我依赖现在许多电子邮件帐户免费提供的强大备份功能。)
在过去的 18 个月中,我一直在使用 Arch Linux 工作,但最近我一直在使用安装了全新 Windows 10 的笔记本电脑工作。 我编写了一个 PowerShell 脚本来在机器之间同步我自己的数据。该脚本为我留下了可能发生或已经发生的更改的日志,这样我就能快速发现任何不寻常的情况。
我安装了gVim
、、、、、& ,然后大约一周前,我发现我所有的存档文件都7-Zip
以某种方式被修改为那一天的日期。Git
Firefox
Google Chrome
Bulk Rename
Ditto
*.eml
LastWriteTime
这是我在受影响的目录中检查的方法:
ls -r *.eml | ForEach-Object { $_.LastWriteTime.ToString('yyyyMMdd-HH:mm:ss') + " : " + $_.FullName } | sort
(ls -r *.eml).count
显示我*.eml
的硬盘分区中散布着近 1800 个文件E:\
。保留它们对我来说并不重要LastWriteTime
,但我更希望如此。
初步诊断:Cortana
- 我检查了一下,
Control Panel > All Control Panel Items > Indexing Options
不包括E:\
。 - 我注意到 Cortana 立即从我的个人档案分析中找到了个人信息
E:
,因此我关闭了 Cortana:(Settings > Privacy > Getting to know you > off-ticked
并清除了本地和我的 Microsoft 在线帐户中关于我的数据库)。 - 我在网上只找到一篇相关的帖子——为什么我的新 Win 7 机器上的某些东西会更改我的所有 .eml 文件的日期?- 但它是关于Windows 搜索。
第二种观点:这是 Windows 10 的一个“功能”
我将我的个人数据目录之一(名为“Further”)复制到同一E:
驱动器中的临时文件夹“Play0”中。除重新标注日期的文件LastWriteTime
外,所有文件均保留其原有内容。.eml
此 PowerShell 命令输出的结果表明可以从我保存在便携式驱动器上的镜像目录中修复文件:
robocopy /mir G:\Further E:\Play0\Further *.eml /np /fft /l
因此,我在没有“列表”开关(/l
)的情况下运行它,并且它可以工作 - 日期恢复到原来的状态,显示我实际创建这些原始*.eml
文件的时间。
使用空文件进行复制
New-Item -ItemType File .\emptyControl
$thousandDaysAgo = (Get-Date).AddDays(-1000)
$thousandDaysAgo
27 August 2013 19:18:51
(New-Item -ItemType File .\emptyOldOriginal.eml).LastWriteTime = $thousandDaysAgo
(New-Item -ItemType File .\emptyOldOriginal.txt).LastWriteTime = $thousandDaysAgo
Copy-Item -Path .\emptyOldOriginal.eml -Destination .\eOOPowerShellv5Copy.eml
Copy-Item -Path .\emptyOldOriginal.txt -Destination .\eOOPowerShellv5Copy.txt
ls | select FullName, LastWriteTime
FullName LastWriteTime
-------- -------------
E:\Play0\emptyControl 23/05/2016 19:18:43
E:\Play0\emptyOldOriginal.eml 27/08/2013 19:18:51
E:\Play0\emptyOldOriginal.txt 27/08/2013 19:18:51
E:\Play0\eOOPowerShellv5Copy.eml 27/08/2013 19:18:51
E:\Play0\eOOPowerShellv5Copy.txt 27/08/2013 19:18:51
- 一切如预期;但现在,在 中Windows Explorer
,我手动复制了这些原件,使用right-click > Copy
接下来是Ctrl+V
,*.eml
时间戳的奇怪之处就开始了:
FullName LastWriteTime
-------- -------------
E:\Play0\emptyControl 23/05/2016 19:18:43
E:\Play0\emptyOldOriginal - Copy.eml 23/05/2016 19:22:28
E:\Play0\emptyOldOriginal - Copy.txt 27/08/2013 19:18:51
E:\Play0\emptyOldOriginal.eml 23/05/2016 19:22:28
E:\Play0\emptyOldOriginal.txt 27/08/2013 19:18:51
E:\Play0\eOOPowerShellv5Copy.eml 27/08/2013 19:18:51
E:\Play0\eOOPowerShellv5Copy.txt 27/08/2013 19:18:51
- 原件和手动副本*.eml
的时间戳均已更新至现在!
奇怪的新闻:这也与 Dropbox 有关
之前,我以为我已经解决了这个问题,于是我安装了 Dropbox,我在 Arch Linux 上用了 18 个月,没有出现任何问题。不幸的是,Robocopy 与 Dropbox 结合使用时会产生奇怪的结果。首先,由于 Dropbox 未运行,
robocopy /mir G:\Further E:\Dropbox\Further *.eml /np /fft
- 报告 389 个文件已被复制,是的,它们到达时的时间是正确的(远古的),但只要我激活 Dropbox,它们就会被LastWriteTime
设置为现在。我的意思不是将它们上传到我的在线 Dropbox 存储的时间,而是现在,Robocopy 运行的时间。并且,
robocopy /mir G:\Further E:\Dropbox\Further *.eml /np /fft /l
- 表明仍然存在差异 - 那 389 个文件......
[编辑] 使用进程监视器检查是否指向 Explorer.EXE
根据@dangph的回答,我过滤了eml
,并在手动复制/粘贴的三秒钟内得到了数百个操作Explorer.EXE
。没有什么明显的。然而,大约一秒钟后,四次调用MsMpEng.exe
。所以
Settings > Windows Defender > Add an exclusion > Exclude a folder > E:\Play0
Process Monitor
现在进行过滤Process Name > is > MsMpEng.exe
,并且Path > contains > eml
我仍然接到电话,因此我更进一步:
Settings > Windows Defender > Real-time protection > Off
现在我的手动复制/粘贴没有触发任何MsMpEng.exe
,但*.eml
文件的日期仍然发生了变化。结论:Explorer.EXE
这是它造成的。
失败,我的问题
我无法解决这个问题,这是一个遗留问题,所以我决定忍受它并继续前进,但我仍然担心这种对我的个人数据的轻微侵犯,因此:在 Windows 10 中,什么原因导致eml
文件在某些复制操作中时间戳被篡改,以及当 Dropbox 处于活动状态时这种情况会如何加剧?
答案1
这是自 Windows Vista 以来就存在的错误并且还影响.nws文件。要修复此问题,请创建一个名为“FixEml.reg”的新文件,其中包含以下几行并运行它:
Windows Registry Editor Version 5.00
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\PropertySystem\PropertyHandlers\.eml]
[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\PropertySystem\PropertyHandlers\.nws]
[-HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\PropertySystem\PropertyHandlers\.eml]
[-HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\PropertySystem\PropertyHandlers\.nws]
此外,即使上次修改日期发生变化,文件的内容实际上并没有改变。
答案2
我不知道是什么导致了这个问题,但你可以尝试使用进程监控找出正在写入文件的内容。
例如,在进程监视器中,您可以设置“路径包含.eml”的过滤器。
(提示:在 Process Monitor 中创建新过滤器时,请先单击过滤器对话框中的重置按钮以清除上一个会话中的所有过滤器。)
现在再次复制文件,进程监视器将显示任何进程何时触及您的文件。
如果噪音太多,您可以右键单击某些内容以排除某些内容,或者可以使过滤器更具体。
答案3
此论坛条目对这个问题有一个非常有趣的回复。它似乎揭示了根本原因,即 Zone.Identifier ADS。
发现这个问题后,我尝试编写一个脚本,从我的文件中删除该 ADS,到目前为止,这似乎已经彻底解决了这个问题(并且不需要更改注册表等)。
我现在还为我的工具编写了一个 GUI,希望它能帮助任何人摆脱这个可能非常令人头疼的错误(我有超过一千个 eml 文件正在同步......)。它在 github 上:https://github.com/bfour/EMLFixer
很高兴听到您的反馈,特别是这是否也适合您,因为我只能在我的计算机上测试它。