1

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

谢谢你们!

4

2 回答 2

2

如果您位于包含目标文件和 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 的有用答案中的-Header开关或将列标题添加到 CSV。Import-Csv

于 2019-12-30T15:34:03.507 回答
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 } }
于 2019-12-30T15:34:40.880 回答