重命名文件名的一部分

时间:2019-09-29 20:59:28

标签: powershell rename

我正在寻找使用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时,该代码不起作用。

2 个答案:

答案 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 预览重命名操作;删除它以执行实际的重命名。