Переименовать файл на основе родительского и родительского каталога и последовательно пронумеровать несколько файлов - PullRequest
0 голосов
/ 21 мая 2019

У меня есть файлы, которые хранятся в формате

C:\Users\xx\test powershell script\studyID\number\filenamedfolder\example.jpg

Требуемый вывод:

studyID_number_1

# последняя цифра должна быть последовательно пронумерована для каждого экземпляра jpgв «папке с именем файла».

Я использовал код, указанный в предыдущих ответах, для поиска, переименования и копирования файлов в корневой каталог.

Я использую Windows 10 и Powershell:

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      15063  1478
Get-childitem "C:\Users\xx\test powershell script\*" -include *.jpg -recurse |% {

$nextName = Join-Path -Path 'C:\Users\xx\test powershell script\*' -ChildPath $_.name

while(Test-Path -Path $nextName)
{
   $nextName = Join-Path "C:\Users\xx\test powershell script" ($_.BaseName + "_$num" + $_.Extension)    
   $num+=1   
}

$ParentOjbect =$_.Directory
$Parent =$ParentOjbect.Name
$GrandParent = $ParentOjbect.Parent
$GreatGran = $GrandParent.Parent
$Extension = $_.Extension
$countRef = [ref] 0

Copy-item $_ -Destination (Join-Path "C:\Users\xx\test powershell script" ('{0}_{1}_{2}{3}' -f $GrandParent,$GreatGran,++$countRef.Value,$Extension))
}

Я пытался использовать код для последовательного именования файлов, но мой код не называет файлы последовательно, если существует более одного jpgв «папке с именем файла».Вместо этого только один jpg копируется и переименовывается в корневую папку.

Я никогда не кодировал PowerShell и не уверен, что сделал неправильно.Я не могу найти существующий ответ.Кто-нибудь может предложить, пожалуйста, корректировку, чтобы это работало?

1 Ответ

0 голосов
/ 21 мая 2019

Поскольку вы хотите изменить нумерацию для каждого каталога, я предлагаю:

  • сначала Set-Location в BaseDir
  • сделать Get-ChildItem с несколькими подстановочными знаками, чтобы сохранить одинаковую глубину subdir
  • сгруппировать по Directory и перенумеровать только внутри этой группы

Это образец дерева:

> tree /F
├───studyID1
│   ├───number1
│   │   └───filenamedfolder
│   │           example1.jpg
│   │           example2.jpg
│   │
│   └───number2
│       └───filenamedfolder
│               example1.jpg
│               example2.jpg
│
└───studyID2
    ├───number1
    │   └───filenamedfolder
    │           example1.jpg
    │           example2.jpg
    │
    └───number2
        └───filenamedfolder
                example1.jpg
                example2.jpg
                example3.jpg

обработано этим скриптом:

## Q:\Test\2019\05\21\SO_56236909.ps1

$BaseDir = Join-Path $ENV:USERPROFILE "test powershell script"
Push-Location $BaseDir

Get-ChildItem -Path *\*\*\* -Filter *.jpg -File |
  Group-Object Directory | ForEach-Object {
    $Cnt=1
    $DirName = $_.Group[0].Directory.Name
    $Number  = $_.Group[0].Directory.Parent.Name
    $StudyID = $_.Group[0].Directory.Parent.Parent.Name
    $_.Group | Rename-Item -NewName {"{0}_{1}_{2}_{3}.jpg" -f `
                  $StudyID,$Number,$DirName,$Script:Cnt++ } -WhatIf
  }
Pop-Location

Если вывод выглядит нормально, удалите -WhatIf

дает это результирующее дерево:

> tree /F
├───studyID1
│   ├───number1
│   │   └───filenamedfolder
│   │           studyID1_number1_1.jpg
│   │           studyID1_number1_2.jpg
│   │
│   └───number2
│       └───filenamedfolder
│               studyID1_number2_1.jpg
│               studyID1_number2_2.jpg
│
└───studyID2
    ├───number1
    │   └───filenamedfolder
    │           studyID2_number1_1.jpg
    │           studyID2_number1_2.jpg
    │
    └───number2
        └───filenamedfolder
                studyID2_number2_1.jpg
                studyID2_number2_2.jpg
                studyID2_number2_3.jpg
...