Переименуйте файлы с тем же именем и расширением (обычно .pdf) в подкаталогах с возрастающим номером - PullRequest
0 голосов
/ 29 апреля 2018

Моя структура папок выглядит так:

Папка 1

  • Файл 1.pdf
  • Файл 2.pdf
  • Файл 3.pdf

Папка 2

  • Файл 1.pdf ---> Переименуйте это в «Файл 1-1.pdf»
  • Файл 2.pdf ---> Переименуйте это в «Файл 2-1.pdf»
  • Файл 5.pdf

SubFolder 2.1

  • Файл 2.pdf ---> Переименуйте это в «Файл 2-2.pdf»
  • Файл 4.pdf
  • Файл 5.pdf ---> Переименуйте это в «Файл 5-1.pdf»

Папка 3

  • Файл 1.pdf ---> Переименуйте его в «Файл 1-2.pdf»
  • Файл 2.pdf ---> Переименуйте его в «Файл 2-3.pdf»
  • Файл 4.pdf ---> Переименуйте его в «Файл 4-1.pdf»
  • Файл 6.pdf
  • Файл 7.pdf

Это то, что я пытался, но это определенно неправильно. Я использую Powershell версии 2.0.

$i = 1 
$folder = Get-ChildItem "C:\Users\xyz\testfolder\pdf_files\"
foreach ($file in $folder){
    if (($file.BaseName + $file.extension) -match ($file.BaseName + 
    $file.extension)){
    Rename-Item -Path $file.FullName -NewName "$($file.BaseName + 
    $i)$($file.extension)" -Verbose -WhatIf
    $i++ 
   }
 }

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Вот альтернативный способ сделать то же самое.

Get-ChildItem -Recurse -file | Group-Object Name | foreach-object {
        $script:i = 1
        $_.Group | Select-Object -Skip 1 | 
           Rename-Item -newname { "{0}-{1}{2}" -f $_.basename, $script:i++, $_.extension }
}

Group-Object дает нам все файлы с одинаковыми именами, и для каждой группы имен первый файл пропускается, а остальные переименовываются.

Он также использует функцию, которая была разработана специально для этого варианта использования, что -NewName может принимать блок сценариев в качестве параметра. Сценарий будет вызываться для каждого элемента конвейера, а результат будет передан Rename-Item как новое имя.

0 голосов
/ 29 апреля 2018

Я только что нашел ответ на свой вопрос от очень доброго человека. Во всяком случае .. есть сценарий PS, который работал для меня ..

$Files = Get-ChildItem -LiteralPath 'C:\Foo\Bar\Files\' -Recurse | Where- 
Object { -not $_.PSIsContainer }
$FileNameCounts = @{}

ForEach ($File In $Files) {
  $BaseName = $File.BaseName

If ($FileNameCounts.Keys -contains $BaseName) {
    $NewName = '{0}-{1}{2}' -f $BaseName, $FileNameCounts[$BaseName], 
    $File.Extension
    $File | Rename-Item -NewName $NewName -WhatIf
    $FileNameCounts[$BaseName]++
  } Else {
    $FileNameCounts[$BaseName] = 1
 }
}
...