我想根据CSV文件中的关键字重命名文件和文件夹。
CSV保存搜索和替换关键字,这些关键字将构成文件和文件夹名称。
搜索|替换文档|DTX处理|PRX实施|IMX…
- 并非所有文件名都包含文件名中的每个单词
- 并非所有文件夹都会在文件夹名称中包含每个单词
- Powershell必须搜索子项目,即文件夹和文件姓名
- 如果找到单词(匹配)-从CSV替换
我看了这些线索来帮助我:
使用Powershell使用查找文件递归重命名目录
powershell脚本重命名目录中的所有文件
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作为查找或引用文件递归搜索和替换文件名和文件夹名。
当您需要按其他值查找值时,通常的数据结构是字典,或者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
}
}
我会试试的。在这种情况下,我假设搜索和替换是您的标题。除了$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"} }
replace处理regex,因此u需要确保正确转义任何特殊字符。