Переименовать часть имени файла - PullRequest
1 голос
/ 29 сентября 2019

Я хочу переименовать часть файла PDF с помощью файла CSV. У меня есть CSV-файл с двумя столбцами, имя и новое имя. Мои pdf-файлы имеют соглашение об именах 222222_test (например) и находятся в папке C: \ TEST. В CSV-файле 222222 находится в столбце имени, а Джонатан - в столбце Newname.
В папке действительно будут сотни документов в формате 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 (только) изменить на Джонатан, чтобы pdf-файл был Jonathan_test. Я смог использовать код, когда имя файла - только 222222, но когда pdf - 222222_test, код не работает.

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Попробуйте, удалите 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
        }
    }
}
0 голосов
/ 01 октября 2019

С сотнями строк CSV стоит заранее создать хеш-таблицу , которая отображает старые имена на новые имена.

Затем вам нужно только зациклить один раз над именами файлов, выполняя быстрый поиск по хеш-таблице в каждой итерации.

# 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 предварительный просмотр операций переименования;удалите его для фактического переименования.

...