[英]Renaming files in directory using new names from csv file
我正在寻求创建脚本的帮助,该脚本可以将目录中包含的所有文件重命名为 csv 文件中引用的表。 例如,我有一个随机文件名的文件夹,我还有一个 csv 文件,A 列中有当前文件名,而实际文件名应该在 B 列中更改为什么。
我考虑过使用以下内容:
get-childitem *pdf -force | foreach { rename-item $_ $_.Name.Replace((Import-Csv -path .\\List.csv).filename, (Import-Csv -Path .\\List.csv).newfilename) }
请注意,文件名和新文件名分别指A列和B列。
当我运行这个脚本时,什么都没有发生。 我是 powershell 的新手,所以我已经达到了如何完成这项任务的知识极限。 任何和所有的帮助将不胜感激!
谢谢你们!
如果您在包含目标文件和 CSV 文件的目录中,您可以执行以下操作。 这假设您的 CSV 中有名为filename
和newfilename
。
$TargetDir = Resolve-Path -Path .
Import-Csv -Path .\List.csv | Foreach-Object {
$Src = Join-Path -Path $TargetDir -ChildPath $_.filename
$Dst = Join-Path -Path $TargetDir -ChildPath $_.newfilename
Rename-Item -Path $Src -NewName $Dst
}
如果目标目录是另一个位置,您可以简单地修改Join-Path
语句以使用-Path
。
$TargetDir = 'c:\folder'
Import-Csv -Path .\List.csv | Foreach-Object {
$Src = Join-Path -Path $TargetDir -ChildPath $_.filename
$Dst = Join-Path -Path $TargetDir -ChildPath $_.newfilename
Rename-Item -Path $Src -NewName $Dst
}
注意:如果 CSV 文件不包含标题,您将需要像Glenn 的有用答案一样使用Import-Csv
的-Header
开关,或者将列标题添加到 CSV。
假设 .csv 中没有标题并且它只包含文件名,这可能对您有用:
# Only import the CSV once
$csvData = Import-Csv .\List.csv -Header "Old","New"
# Remove the -WhatIf after testing
Get-ChildItem | ForEach-Object {
$file = $_
$csvData | Where-Object {
$_.Old -eq $file.Name
} | ForEach-Object {
Rename-Item -Path $file -NewName $_.New -WhatIf
}
}
或者更简洁的实现:
$csvData = Import-Csv .\List.csv -Header "Old","New"
dir | %{ $file = $_; $csvData | ?{ $_.Old -eq $file.Name } | %{ Rename-Item -Path $file -NewName $_.New -WhatIf } }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.