Исправьте временную метку с помощью скрипта PowerShell после сравнения с именем файла - PullRequest
0 голосов
/ 01 июля 2018

У меня есть куча .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 голосов
/ 01 июля 2018

Следующее решение:

  • передает блок сценария непосредственно в -NewName, чтобы вычислить новое имя файла (которое также используется в вашем вопросе), что более эффективно (и более кратко), чем использование вызова ForEach-Object, чей сценарий вызовы блоков Rename-Item в каждой итерации.

  • использует -PassThru для вывода переименованных файлов, что позволяет передавать по трубопроводу в Export-Csv для переименования файлов и создания файла CSV в одном конвейере.

  • использует вычисленные свойства для преобразования и переименования свойств, представляющих интерес для выходного файла 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, который только просматривает операции переименования, позволяя вам убедиться, что новые имена построены в соответствии с ожиданиями.
Удалите -WhatIf, чтобы выполнить фактическое переименование.

0 голосов
/ 01 июля 2018

вы бы искали что-то подобное для переименования файла с правильной датой / временем.

#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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...