使用CSV文件中的新名称重命名目录中的文件

时间:2019-12-30 15:08:14

标签: powershell get-childitem cmdlet import-csv rename-item-cmdlet

我正在寻求帮助来创建一个脚本,该脚本可以将目录中包含的所有文件重命名为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的新手,所以我对如何完成此任务的知识有所了解。任何帮助都将不胜感激!

谢谢大家!

2 个答案:

答案 0 :(得分:1)

如果位于包含目标文件和CSV文件的目录中,则可以执行以下操作。假设您的CSV标头中有filenamenewfilename

$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's helpful answer中那样利用-Header中的Import-Csv开关或添加CSV的列标题。

答案 1 :(得分:0)

假设.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 } }