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

时间:2019-01-13 07:55:55

标签: powershell powershell-v3.0

我有一个导出的CSV文件,带有下表

"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

它适用于第一个文件夹,但是此后的每个文件夹都使用第一个文件夹中的相同基名。它不会像我想的那样递归根目录中的每个文件夹。因此,对于电影(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 :(得分:0)

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

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

更改此:

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

对此:

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

答案 1 :(得分:0)

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

最终对我有用的代码是这样;

# 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'}
}