关于Powershell:使用备用BaseName查找(CSV)名称重命名文件

 2021-04-09 

Renaming files using alternate BaseName lookup (CSV) names

我有一个导出的CSV文件,其下表如下所示:

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

我的代码非常接近我想要的代码,基本上是将每个文件夹中的cover.jpg重命名为电影的基本名称,并在其后添加-poster.jpg,例如Movie-poster.jpgMovie 2-poster.jpg

它适用于第一个文件夹,但是此后的每个文件夹都使用第一个文件夹中的相同基名。它不会像我想的那样递归根目录中的每个文件夹。因此,对于Movie(2001),我最终拥有Movie-poster.jpg,而不是Movie 2-poster.jpg

这是尚不存在的代码:

1
2
3
4
5
$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都将根据其位置重命名以与基本名称匹配。


感谢Ansgar的评论。它在我的实例中不起作用,它所做的是将所有文件(包括已经具有正确命名约定的文件)重命名为cover-poster.jpg,但是代码确实为我指出了有关$的正确方向line.Directory。

最终对我有用的代码是;

1
2
3
4
5
# 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'}
}


您最终将所有封面都重命名为Movie-poster.jpg,因为您的代码在循环的第一次迭代中将当前工作目录(.)下的所有封面重命名,因此没有文件带有字符串"" Cover循环进入第二次迭代时,其名称中的" "就保留了。

从CSV处理目录,而不是为每个目录处理当前工作目录,然后使用管道中的当前对象($_)重命名文件。对于后者,您还必须将括号替换为大括号。

更改此内容:

1
2
3
4
foreach ($line in $lines) {
    Get-ChildItem -Path .\\* -File -Filter '*Cover*' -Recurse |
        Rename-Item -NewName ($line.BaseName + '-poster.jpg')
}

变成这样:

1
2
3
4
foreach ($line in $lines) {
    Get-ChildItem -Path $line.Directory -File -Filter '*Cover*' -Recurse |
        Rename-Item -NewName {$_.BaseName + '-poster.jpg'}
}