You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

程序运行时编辑文件后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)

    }

}
问题分析与解决建议
  1. 原因解析
    并非文件处于「管道」中,而是文件编辑保存后,系统或PowerShell可能缓存了文件的元数据(包括LastWriteTime)。当你在工具打开文件的状态下编辑副本,即使关闭了文件和工具,部分文件句柄可能未完全释放,或者Get-Item读取的是缓存的旧属性值,导致检测不到时间变化。

  2. 解决方案

    • 强制刷新文件属性:先获取文件对象并主动刷新属性,避免读取缓存值:
      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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:42:47