我有一个导出的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
都将根据其位置重命名以与基本名称匹配。
答案 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'}
}