2016-04-30 60 views
0

我想根据CSV文件中找到的关键字重命名文件和文件夹。重命名文件和文件夹关键字 - 使用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作为查找或引用文件中的文件和文件夹名称取代。

+0

欢迎计算器!请分享您的代码以及任何错误消息。 – user4317867

回答

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 
    } 
} 
+0

您好Ansgar,感谢您的代码,它正确地重命名了这些文件夹。它没有重命名文件夹内的文件。请原谅我的无知,我将文件夹变量更改为$文件? – SA90

+1

对不起,这是我的错误。我忘了将参数'-Recurse'添加到'Get-ChildItem'中,因此代码实际上并没有递归到文件夹中。固定。 –

+0

嗨Ansgar,它改名为儿童物品 - 谢谢。最后一个小细节 - 我得到这个错误重命名 - 项目:源和目标路径必须不同,我将文件夹设置到我的桌面。该脚本位于另一个文件夹中,不知道为什么会发生此错误 - – SA90

0

生病给它一个镜头。我假设搜索和替换是你在这种情况下的头。这除了你的$文件夹和$ 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"} } 

替换句柄正则表达式,所以你需要确保任何特殊字符正确转义。

+0

您好蒙特利,我跑错了代码错误消息丢失(+为每个($ obj在$ csvobject){ – SA90

+0

这甚至不是有效的PowerShell语法 –

+0

我很抱歉看起来有一些格式错误,我错过了当我张贴。在手机浏览器上工作@ansgar什么不是PS语法? –