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

求助:如何按文件最后保存日期重命名文件(PowerShell相关)

解决文件按最后保存日期重命名的问题

你当前代码用的$_.LastWriteTime是文件系统层面的修改时间,和资源管理器里显示的“最后保存日期”不是同一个属性,所以才会出现不符合预期的结果。下面分场景给出解决方案:

场景1:Office文档(Word/Excel/PowerPoint等)

Office文件会在扩展属性中单独记录“最后保存日期”,可以通过Shell对象读取这个属性:

Get-ChildItem -Filter "*.docx","*.xlsx","*.pptx" | ForEach-Object {
    $shell = New-Object -ComObject Shell.Application
    $folder = $shell.Namespace($_.DirectoryName)
    $file = $folder.ParseName($_.Name)
    # 中文系统中"最后保存日期"的属性索引通常是155,若不匹配可按下方方法查找
    $lastSavedDateStr = $folder.GetDetailsOf($file, 155)
    
    if (-not [string]::IsNullOrEmpty($lastSavedDateStr)) {
        $lastSavedDate = [DateTime]::Parse($lastSavedDateStr)
        $newFileName = "{0} {1}{2}" -f $_.BaseName, $lastSavedDate.ToString("yyyy-MM-dd"), $_.Extension
        # -WhatIf用于预览修改,确认无误后删除该参数执行实际重命名
        Rename-Item -Path $_.FullName -NewName $newFileName -WhatIf
    }
}

如何确认属性索引(若155不生效)

如果你的系统语言不是中文,或者属性索引不匹配,先运行以下代码找到“最后保存日期”对应的索引:

$testFile = Get-ChildItem | Select-Object -First 1
$shell = New-Object -ComObject Shell.Application
$folder = $shell.Namespace($testFile.DirectoryName)

# 遍历0-200的属性索引,找到目标属性名称
for ($i=0; $i -le 200; $i++) {
    $propName = $folder.GetDetailsOf($null, $i)
    if ($propName -eq "最后保存日期") {
        Write-Host "目标属性索引:$i"
        break
    }
}

场景2:普通文件(非Office格式)

如果资源管理器里的“最后保存日期”对应文件的创建时间或访问时间,直接替换属性即可:

  • 按创建时间重命名:
Get-ChildItem | Rename-Item -NewName {"{0} {1}{2}" -f $_.BaseName, $_.CreationTime.ToString("yyyy-MM-dd"), $_.Extension} -WhatIf
  • 按访问时间重命名:
Get-ChildItem | Rename-Item -NewName {"{0} {1}{2}" -f $_.BaseName, $_.LastAccessTime.ToString("yyyy-MM-dd"), $_.Extension} -WhatIf

注意:所有代码中的-WhatIf参数仅用于预览重命名结果,确认无误后删除该参数再执行,避免误操作。

内容的提问来源于stack exchange,提问作者ans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:50:29