【问题标题】:Renaming files in directory using new names from csv file使用 csv 文件中的新名称重命名目录中的文件
【发布时间】:2020-04-19 07:44:45
【问题描述】:

我正在寻求有关创建脚本的帮助,该脚本可以将目录中包含的所有文件重命名为 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) }

请注意,filenamenewfilename 分别指的是 AB 列。

当我运行这个脚本时,什么都没有发生。我是 powershell 的新手,所以我已经达到了我对如何完成这项任务的了解的极限。任何和所有的帮助将不胜感激!

谢谢大家!

【问题讨论】:

  • CSV 文件是否包含文件的完整路径或仅包含文件名?
  • @AdminOfThings 只是文件名,但我可以修改电子表格以包含文件路径(当前名称和新名称)。
  • @Theo 不是真的,我看过那篇文章,答案对我目前的情况并没有太大作用

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


【解决方案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 文件不包含标题,您将需要使用 Import-Csv 中的 -Header 开关,就像在 Glenn's helpful answer 中一样,或者将列标题添加到 CSV。

【讨论】:

  • 比我的答案更好。
  • 这两个答案都有一些有用的元素。
  • 对不起,先生们,一定是我做错了什么,或者电子表格中有不同之处。我运行此脚本并收到以下错误消息: Rename-Item : Cannot rename the item at 'C:\Users\ZZZZZZ\Desktop\Name Testing' 因为它正在使用中。在 line:4 char:5 + Rename-Item -Path $Src -NewName $Dst
  • @Ric.Mart 我进行了一些代码编辑,以使两种方法的体验更加相似。
【解决方案2】:

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

【讨论】:

  • 我在使用和不使用 -whatif 参数的情况下运行脚本,但看起来没有发生任何事情。我应该包括像“旧”和“新”这样的标题吗?
  • 我上次编辑时出错(使用%{ $_.Old -eq $file.Name } 而不是?{ $_.Old -eq $file.Name })。如果您仍然看不到任何输出,则可能找不到文件名的匹配项。
  • 这是一个示例截图,其中包含我汇总的一些测试数据:i.imgur.com/6nvOBjc.png
猜你喜欢
  • 2014-06-01
  • 2022-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-07
  • 2016-07-15
  • 2019-11-13
相关资源
最近更新 更多