PowerShell按各文件最后写入时间重命名tiff文件报错求助
PowerShell 按文件最后写入时间批量重命名TIFF文件方案
原有脚本错误原因
- 第一版脚本仅在初始化时执行一次
Get-Date取系统当前时间,所有文件共用同一个时间字符串作为文件名,必然触发重名报错,且取值不是文件自身的最后写入时间,不符合需求。 - 第二版脚本直接把
Get-Date命令写在普通双引号字符串中,PowerShell不会解析执行字符串内的命令,再加引号嵌套语法错误,直接触发参数绑定异常。 - 额外注意:原测试用的时间格式串存在占位符错误:小写
mm代表分钟,代表两位月份的占位符是大写MM,原输出结果中月份位置的异常数值就是占位符写错导致的。
可用脚本
基础版(无重名兜底)
替换脚本中$targetPath的值为实际目标文件夹路径即可运行:
$targetPath = "C:\blah" Get-ChildItem -Path $targetPath -Filter *.tiff -File | ForEach-Object { $timeStr = $_.LastWriteTime.ToString("yyyyMMddHHmmss") Rename-Item -Path $_.FullName -NewName "$timeStr.tif" }
优化版(自动处理同秒重名冲突)
如果存在同一秒内写入的多个.tiff文件,基础版会触发重名报错,优化版会自动给重名文件加递增序号后缀:
$targetPath = "C:\blah" Get-ChildItem -Path $targetPath -Filter *.tiff -File | ForEach-Object { $baseTimeStr = $_.LastWriteTime.ToString("yyyyMMddHHmmss") $newName = "$baseTimeStr.tif" $index = 1 while (Test-Path (Join-Path $targetPath $newName)) { $newName = "${baseTimeStr}_$index.tif" $index++ } Rename-Item -Path $_.FullName -NewName $newName }
关键注意点
Get-ChildItem后加-File参数,仅匹配文件,避免误匹配后缀为.tiff的文件夹引发错误。- 时间格式占位符严格区分大小写,不要把月份
MM错写为分钟mm。 - 如果要在字符串内直接执行表达式取值,必须用
$()子表达式包裹,例如内联写法为"$($_.LastWriteTime.ToString('yyyyMMddHHmmss')).tif",直接把命令写在字符串里不会被执行。
内容的提问来源于stack exchange,提问作者Jadkins It
相关产品推荐
相关产品推荐

