与文件名比较后,使用PowerShell脚本更正时间戳

时间:2018-07-01 10:58:08

标签: powershell csv filenames

我有一堆.jpg文件被保存到不同的文件夹中,但文件名上的时间戳记错误(延迟1小时),我想根据创建时间进行更正。这样做的目的是获得一张CSV表,其中包含所有更正后的文件名及其完整路径。

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

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

Filename, Created Date, Modified Date
20180524010500530_FR785101.jpg, 2018-05-24 00:05:00, 2018-05-24 00:05:34

正确的输出为:

Filename, Created Date, Modified Date
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"))
    }

更新:

我希望得到的最终.csv输出如下:

File path, date time, name
path_of_file, Timestamp, Name
C:_users_mind_volume, 20180524000500530, FR785101

2 个答案:

答案 0 :(得分:1)

您会寻找类似的东西来重命名具有正确日期/时间的文件。

| accountID | check_name | check1 | check2 | check3 | result |
+-----------|------------|--------|--------|--------|--------|
| test_account | abc123  | pass   | fail   | 0      | null   |
| test_account | xyz7892 | pass   | fail   | 0      | [1, 2] |
| test_account | foobar11012387 | fail   | pass   | 0      | [1, 2] |

这只会将它们导出到您桌面上的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
}

答案 1 :(得分:0)

以下解决方案:

  • 将脚本块直接传递到-NewName以便计算新文件名(在您的问题中也使用过),比使用{{1}更有效(更简洁) }的脚本块在每次迭代中调用ForEach-Object

  • 使用Rename-Item输出重命名的文件,这可以使用管道传递到-PassThru以便重命名文件并在单个管道中创建CSV文件。

  • 使用calculated properties来转换和重命名输出CSV文件的目标属性。

Export-Csv

请注意Get-ChildItem -Path "c:/path/to/files" -File -Recurse *.jpg | Rename-Item -WhatIf -PassThru -NewName { '{0}_{1}' -f $_.CreationTime.ToString('yyyyMMddHHmmssfff'), ($_.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 公用参数,该公用参数仅预览重命名操作,使您可以验证新名称的构造是否符合预期。
删除-WhatIf以执行实际的重命名。