我正在寻找使用csv文件批量重命名pdf文件的一部分。我有一个csv文件,其中包含两列,即name和Newname。我的pdf文件的命名约定为222222_test(例如),位于C:\ TEST文件夹中。在csv文件中,“名称”列中为222222,在“新名称”列中为乔纳森。
只要我可以使用该文件夹,该文件夹实际上将具有数百个pdf文档。
$csv = Import-Csv "C:\TEST\Book1.csv"
# location of your files
$files = get-childitem "C:\TEST\*.DOCX"
foreach($item in $CSV){
foreach($file in $files){
if($item.name -eq $file.basename){
rename-item $file.fullname -NewName "$($item.newname)$($file.extension)" -Verbose
}
}
}
我正在寻找将222222(仅)更改为Jonathan的方法,因此pdf文件为Jonathan_test。当文件名仅为222222时,我可以使用该代码,但是当pdf为222222_test时,该代码不起作用。
答案 0 :(得分:1)
尝试一下,如果适用于您的文件,请删除WhatIf。否则,我们将需要从csv中查看一些示例数据。
foreach ($item in $CSV) {
foreach ($file in $files) {
if ($item.name -eq $file.basename) {
Rename-Item $file.fullname -NewName $($file.FullName -replace $item.name, $item.newname) -WhatIf
}
}
}
答案 1 :(得分:0)
具有数百个CSV行,因此需要预先构建一个 hashtable 来将旧名称映射为新名称。
然后,您只需在文件名上循环 ,即可在每次迭代中执行快速哈希表查找。
# Initialize the hashtable.
$ht = @{}
# Fill the hashtable, with the "name" column's values as the keys,
# and the "newname" columns as the values.
Import-Csv C:\TEST\Book1.csv |
ForEach-Object {
$ht.Add($_.name, $_.newname)
}
# Loop over the files and rename them based on the hashtable
Get-ChildItem C:\TEST\*.DOCX | Rename-Item -NewName {
$prefix = ($_.BaseName -split '_')[0] # Get prefix (before "_")
$newPrefix = $ht[$prefix] # Look up the prefix in the hashtable.
if ($newPrefix) { # Replace the prefix, if a match was found.
$newPrefix + $_.Name.Substring($prefix.Length)
}
else { # No replacement - output the original name, which is a no-op.
$_.Name
}
} -WhatIf
-WhatIf
预览重命名操作;删除它以执行实际的重命名。