使用备用 BaseName 查找 (CSV) 名称重命名文件

Renaming files using alternate BaseName lookup (CSV) names

我有一个导出的 CSV 文件,其中包含以下 table

"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 将根据其位置重命名以匹配基本名称。

您最终将所有封面重命名为 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>
}

感谢 Ansgar 的评论。它在我的实例中不起作用,它所做的是将所有文件(包括那些已经具有正确命名约定的文件)重命名为 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'}
}