重命名文件&文件夹关键字 - 使用CSV查找文件

时间:2016-04-30 21:29:46

标签: csv powershell rename

我想根据CSV文件中的关键字重命名文件和文件夹。

CSV包含搜索和替换组成文件和文件夹名称的关键字。

Search | Replace
Document | DTX
Processing | PRX
Implementation | IMX
...
  • 并非所有文件名都包含文件名中的每个单词。
  • 并非所有文件夹都会包含文件夹名称中的每个单词
  • Powershell必须搜索子项,即文件夹和文件 名。
  • 如果找到单词(匹配) - 从CSV替换

我看过这些帖子来帮助我:

Using Powershell to recursively rename directories using a lookup file

powershell script to rename all files in directory

http://code.adonline.id.au/batch-rename-files/

我只管理了以下代码段

$folder = "C:\Folders"               #target folder containing files
$csv    = "C:\FileNameKeywords.csv"             #path to CSV file

cd ($folder);
Import-Csv ($csv) | foreach {
  Rename-Item -Path $_.Path -NewName $_.Filename
}

它一次只能替换一个。

问题:

如何使用CSV作为查找或参考文件递归搜索和替换文件和文件夹名称。

2 个答案:

答案 0 :(得分:3)

当您需要按其他值查找值时,通常的go-to数据结构是字典,或者在PowerShell中表示哈希表。将您的CSV读入如下字典:

$keywords = @{}
Import-Csv $csv | ForEach-Object {
  $keywords[$_.Search] = $_.Replace
}

然后遍历您的文件夹树并通过将每个键替换为其各自的值来构建新的文件名:

Get-ChildItem $folder -Recurse | ForEach-Object {
  $newname = $_.Name
  foreach ($word in $keywords.Keys) {
    $newname = $newname.Replace($word, $keywords[$word])
  }

  if ($_.Name -ne $newname) {
    Rename-Item -Path $_.FullName -NewName $newname
  }
}

答案 1 :(得分:0)

不好试一试。我假设在这种情况下搜索和替换是你的标题。除了你的$ folder和$ csv变量之外。

$csvobject=import-csv $csv 
Foreach($obj in $csvobject){ 
$search=$obj.search
$replace=$obj.replace
get-childitem path $folder |where{$_.name -like "$($obj.search)"} | rename-item -newname {$_.name -replace "$search", "$replace"} }

替换处理正则表达式,因此您需要确保正确转义任何特殊字符。