使用备用 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'}
}
我有一个导出的 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'}
}