Как пакетно переименовать папки и файлы внутри них на основе файла CSV с PowerShell? - PullRequest
0 голосов
/ 10 июля 2019

Мне нужно пакетно переименовать 2000+ папок, а затем переименовать изображения внутри этих папок с новым именем папки + название продукта + порядковый номер + расширение ".jpg", все это на основе CSV-файла, который я создали, что выглядит так:

folder_old_name,folder_new_name,folder_path,product_name
102597,WK240,C:\Users\Elvis\Desktop\Products\WK240,CASIO_DIGITAL_PIANO

Вот пример текущей папки и ее содержимого:

102597
CASIODIGITALPIANOFRONT.jpg
CASIODIGITALPIANOSIDE.jpg
CASIODIGITALPIANOWITHBOX.jpg

После процесса оно должно выглядеть так:

WK240
WK240_CASIO_DIGITAL_PIANO_1.jpg
WK240_CASIO_DIGITAL_PIANO_2.jpg
WK240_CASIO_DIGITAL_PIANO_3.jpg

Мне удалось переименовать все папки с помощью приведенного ниже кода, но я понятия не имею, как включить инструкцию для переименования файлов так, как я описал.

$invocation = (Get-Variable MyInvocation).Value
$directorypath = Split-Path $invocation.MyCommand.Path

Import-Csv "C:\Users\Elvis\Desktop\batch_rename.csv" | ForEach-Object {
    $old = $_.folder_old_name
    if (Test-Path ($old)) {
        $newPath = $_.folder_new_name
        ren $old $newPath
    }
}

Буду признателен, если кто-нибудь поможет мне сделать все это сразу.

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Основные шаги:

1. import the csv that contains rename instructions
2. loops through the csv
 1. rename the folder to its new name
 2. get all files in the folder that was just renamed
 3. loop through all the files in that folder
   1. construct the new name with data from the csv 
   2. rename the file

Я не тестировал этот код, но это в основном то, на что он может быть похож.

$csv = import-csv -path "path\to\csv"

# loop through rows in csv
foreach($row in $csv){

    # this assumes folder_old_name is in current working directory
    # if its not you can use the Join-Path cmdlet to construct the path.
    Rename-Item -Path $row.folder_old_name -NewName $row.folder_new_name

    # get files and start filename construction
    $files = Get-ChildItem -Path $row.folder_new_name
    $fileIncrement = 1
    $FileBaseName = $row.folder_new_name + '_' + $row.product_name

    # loop through files
    foreach($file in $files){


        # increment filename
        $NewFileName = $FileBaseName + '_' + $fileIncrement + $file.Extension

        # rename file
        Rename-Item -Path $file.FullName -NewName $NewFileName

        $fileIncrement++
    }
}
0 голосов
/ 10 июля 2019

Это должно занять вас часть пути. В любом случае, вероятно, лучше все делать в два этапа. Переименование файлов зависит от папок с новыми именами.

$csv = import-csv input.csv

foreach ($line in $csv) { 

  $product = $line.product_name
  $dir = $line.folder_new_name
  $path = $line.folder_path

  get-childitem $path\*.jpg | 
  foreach {$i=1} {
    Rename-Item $_ -NewName ($dir + '_' + $product + '_' + $i++) -whatif
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...