Переименование файлов с использованием альтернативных имен поиска BaseName (CSV) - PullRequest
0 голосов
/ 13 января 2019

У меня есть экспортированный файл CSV с таблицей ниже

"Directory","BaseName"
"E:\Movie Files\Movie (2000)","Movie"
"E:\Movie Files\Movie (2001)","Movie 2"

Мой код очень близок к тому, что я хочу, и это, в основном, переименование cover.jpg в каждой папке в базовое имя фильма и добавление -poster.jpg после него, например, Movie-poster.jpg, Movie 2-poster.jpg.

Это работает для первой папки, но каждая папка после этого использует одно и то же базовое имя из первой папки. Он не работает для каждой папки в корневом каталоге, как я думал. Так что для фильма (2001) у меня в конечном итоге Movie-poster.jpg, а не Movie 2-poster.jpg.

Это код, который не совсем там:

$lines = Import-Csv 'E:\Output.csv'
foreach ($line in $lines) {
    Get-ChildItem -Path .\* -File -Filter '*Cover*' -Recurse |
        Rename-Item -NewName ($line.BaseName + '-poster.jpg')
}

Ожидаемые результаты, как упомянуто выше, состоят в том, что каждый cover.jpg в каждой папке и подпапках будет переименован в соответствии с базовым именем в соответствии с их местоположением.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Спасибо, Ансгар, за комментарий. В моем случае это не сработало, оно переименовало ВСЕ файлы (включая те, которые уже имели правильное соглашение об именах) в cover-poster.jpg, однако код указывал мне правильное направление в отношении $ line .directory.

Код, который работал для меня в конце концов, был таким:

# Renames Cover.jpg to match BaseName file with basename-poster.jpg
$lines = Import-Csv 'E:\Output.csv'
    ForEach ($line in $lines) {
    Get-ChildItem -Path $line.Directory -file -filter '*Cover*' -Recurse | Rename-Item -NewName {$line.BaseName + '-poster.jpg'}
}
0 голосов
/ 13 января 2019

В итоге все обложки будут переименованы в Movie-poster.jpg, поскольку ваш код переименовывает все обложки в текущем рабочем каталоге (.) на первой итерации цикла, поэтому нет файлов со строкой "Cover" их имя осталось, когда цикл переходит во вторую итерацию.

Обрабатывайте каталоги из CSV вместо обработки текущего рабочего каталога для каждого из них и используйте текущий объект из конвейера ($_) для переименования файлов. Для последнего вы также должны заменить скобки фигурными скобками.

Изменить это:

foreach ($line in $lines) {
    Get-ChildItem -Path <b><i>.\*</i></b> -File -Filter '*Cover*' -Recurse |
        Rename-Item -NewName <b><i>($line.BaseName + '-poster.jpg')</i></b>
}

в это:

foreach ($line in $lines) {
    Get-ChildItem -Path <b><i>$line.Directory</i></b> -File -Filter '*Cover*' -Recurse |
        Rename-Item -NewName <b><i>{$_.BaseName + '-poster.jpg'}</i></b>
}
...