程序运行时编辑文件后LastWriteTime未更新的PowerShell问题
问题描述
- 背景:作为PowerShell新手,制作了一款工具解决多层嵌套文件无法双击打开的问题,操作流程为:右键点击文件→通过「发送到」菜单选择工具→工具将文件复制到「文档」文件夹的子目录并从该处打开。
- 异常现象:
- 异常场景:用工具打开文件后立即编辑本地副本,保存并关闭文件和工具后,再次使用工具打开原文件时,无法检测到本地副本的
LastWriteTime变化,覆盖提示及对应代码不触发。 - 正常场景:先关闭文件和工具,再编辑本地副本,再次使用工具打开原文件时,覆盖提示及代码可正常运行。
- 异常场景:用工具打开文件后立即编辑本地副本,保存并关闭文件和工具后,再次使用工具打开原文件时,无法检测到本地副本的
- 相关检测代码:
If ([System.IO.File]::Exists($FileName)) { [datetime]$DestinationFile = (Get-Item $OldFileName).LastWriteTime [datetime]$SourceFile = (Get-Item $FileName).LastWriteTime If ($DestinationFile -gt $SourceFile) { #Overwrite prompt and code here (in Japanese, so I won't include it) } }
问题分析与解决建议
原因解析
并非文件处于「管道」中,而是文件编辑保存后,系统或PowerShell可能缓存了文件的元数据(包括LastWriteTime)。当你在工具打开文件的状态下编辑副本,即使关闭了文件和工具,部分文件句柄可能未完全释放,或者Get-Item读取的是缓存的旧属性值,导致检测不到时间变化。解决方案
- 强制刷新文件属性:先获取文件对象并主动刷新属性,避免读取缓存值:
If ([System.IO.File]::Exists($FileName)) { $destFile = Get-Item $OldFileName $destFile.Refresh() # 强制刷新文件元数据 [datetime]$DestinationFile = $destFile.LastWriteTime $srcFile = Get-Item $FileName $srcFile.Refresh() [datetime]$SourceFile = $srcFile.LastWriteTime If ($DestinationFile -gt $SourceFile) { #Overwrite prompt and code here } } - 直接调用.NET静态方法:绕开PowerShell的缓存机制,直接读取系统最新的文件写入时间:
If ([System.IO.File]::Exists($FileName)) { [datetime]$DestinationFile = [System.IO.File]::GetLastWriteTime($OldFileName) [datetime]$SourceFile = [System.IO.File]::GetLastWriteTime($FileName) If ($DestinationFile -gt $SourceFile) { #Overwrite prompt and code here } } - 确认进程完全退出:编辑副本后,检查任务管理器确保编辑文件的程序和你的工具都完全关闭,避免残留的文件句柄影响元数据更新。
- 强制刷新文件属性:先获取文件对象并主动刷新属性,避免读取缓存值:
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

