求助:如何按文件最后保存日期重命名文件(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
相关产品推荐
相关产品推荐

