如何与文件名比较后用PowerShell脚本更正时间戳?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (131)

我有一堆.jpg文件保留在不同的文件夹中,文件名上有一个错误的时间戳(延迟1小时),我想根据创建时间纠正它。这样做的目的是获取一张包含所有已更正文件名及其完整路径的CSV表。

我现在正在尝试编写一个PowerShell脚本,该脚本可以遍历所有文件夹,提取创建时间并使用错误的时间戳将其替换为文件名。下面是一个小例子:

带有错误时间戳的原始文件名:

文件名,创建日期,修改日期
20180524010500530_FR785101.jpg,2018-05-24 00:05:00,2018-05-24 00:05:34

正确的输出是:

文件名,创建日期,修改日期
20180524000500530_FR785101.jpg,2018-05-24 00:05:00,2018-05-24 00:05:34

我已经开始记录自己使用该CreationTime命令,但我仍然无法弄清楚如何提取创建时间并将其替换为文件名时间戳。另外,我不知道如何让脚本遍历包含图像文件的所有文件夹和子文件夹,最终将所有内容导出到CSV表格中。

Get-ChildItem -Path "c:/path/to/files/" -Recurse -Include @("*.jpg") |
    Rename-Item -NewName {
        $_.Name -replace "IMG", ($_.CreationTime.ToString("yyyyMMdd"))
    }
提问于
用户回答回答于

以下解决方案:

  • 直接传递脚本块-NewName以便计算新文件名,这比使用ForEach-Object脚本块Rename-Item在每次迭代中调用的调用更有效(也更简洁)。
  • 用于-PassThru输出重命名的文件,这使得管道可以Export-Csv重命名文件并在单个管道中创建CSV文件。
  • 使用计算属性来转换和重命名输出CSV文件的感兴趣属性。
Get-ChildItem -Path "c:/path/to/files/" -Recurse *.jpg | 
  Rename-Item -PassThru -NewName { 
     '{0}_{1}' -f $_.CreationTime.ToString('yyyyMMddHHmmss'), ($_.Name -split '_')[1] 
    } | 
        Select-Object @{ n='path_of_file'; e={ $_.FullName -replace '\\', '_' } }, 
                      @{ n='Timestamp'; e={ ($_.BaseName -split '_')[0] } }, 
                      @{ n='Name'; e={ ($_.BaseName -split '_')[1] } } |
            Export-Csv -NoTypeInformation .\out.csv
用户回答回答于

你可能会寻找这样的东西来重命名一个文件,并使用正确的日期/时间。

#Rename file directly to correct format.
Get-ChildItem -Filter '*.jpg' -Recurse | ForEach-Object {
    $NewTimestamp = $_.CreationTime.ToString('yyyyMMddHHmmss')
    Rename-Item -LiteralPath $_.FullName -NewName ($_.BaseName -replace '.*(_.*)',($NewTimestamp+'$1'+$_.Extension)) -WhatIf
}

这只会将它们导出到桌面上的CSV。

#Export details to CSV
Get-ChildItem -Filter '*.jpg' -Recurse | Select FullName,CreationTime,LastWriteTime | Export-Csv -Path "~\Desktop\Images.csv" -NoTypeInformation

扫码关注云+社区

领取腾讯云代金券