【问题标题】:Rename Files & Folders Keywords - Using a CSV Look Up File重命名文件和文件夹关键字 - 使用 CSV 查找文件
【发布时间】:2016-08-25 22:07:36
【问题描述】:

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

CSV 保存构成文件和文件夹名称的搜索和替换关键字。

搜索 |代替
文件 | DTX
加工 | PRX
实施 | 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/

我只在sn-p以下管理过

$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 作为查找或参考文件在文件和文件夹名称中递归搜索和替换。

【问题讨论】:

  • 欢迎来到 Stackoverflow!请与任何错误消息一起分享您的代码。

标签: csv powershell rename


【解决方案1】:

我会试一试。在这种情况下,我假设搜索和替换是您的标题。除了您的 $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"} }

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

【讨论】:

  • 您好 Monterey,我运行代码时出现错误消息 Missing ( + For each($obj in $csvobject){
  • 这甚至不是有效的 PowerShell 语法。
  • 我很抱歉,看起来我在发布时遗漏了一些格式错误。我正在研究移动浏览器。 @ansgar 什么不是 PS 语法?
  • 您最初发布的代码。即使在您编辑之后,Rename-Item 仍然会抛出错误,因为从管道读取时参数-Path 无效。请在发布答案之前测试您的代码。
【解决方案2】:

当您需要通过其他值查找值时,通常的首选数据结构是字典,或者在 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
  }
}

【讨论】:

  • 您好 Ansgar,感谢您的代码。它正确地重命名了文件夹。它没有重命名文件夹内的文件。请原谅我的无知我是否将文件夹变量更改为 $file?
  • 对不起,这是我的错误。我忘记将参数-Recurse 添加到Get-ChildItem,因此代码实际上并没有递归到文件夹中。固定。
  • 嗨 Ansgar,它重命名了子项 - 谢谢。最后一个小细节 - 我确实收到此错误重命名项目:源路径和目标路径必须不同,我将文件夹设置为我的桌面。该脚本位于另一个文件夹中,不确定为什么会发生此错误 -
  • 这意味着原始文件名没有改变,所以文件不需要重命名。将Rename-Item 置于if 条件中以处理这种情况。查看更新的答案。
  • Ansgar - 非常感谢您对编码的帮助:)。我非常感谢你,谢谢你,祝你有美好的一天。
猜你喜欢
  • 1970-01-01
  • 2019-04-28
  • 2014-09-09
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 2020-10-28
  • 2019-02-23
  • 2012-01-18
相关资源
最近更新 更多