根据大parent和parent目录重命名文件并顺序编号多个文件

Rename file based on grand parent and parent directory and sequentially number multiple files

我有一个以

格式存储的文件
C:\Users\xx\test powershell script\studyID\number\filenamedfolder\example.jpg

期望的输出是:

studyID_number_1

#'filenamedfolder' 中每个 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))
}

我曾尝试使用代码按顺序命名文件,但当 'filenamedfolder' 中存在多个 jpg 时,我的代码没有按顺序命名文件。而是只复制一张 jpg 并重命名到根文件夹中。

我从来没有在 powershell 中编码过,我不确定我做错了什么。我似乎找不到现有的答案。任何人都可以建议进行调整以使其正常工作吗?

如果你想为每个目录重新编号,我建议:

  • Set-Location到BaseDir
  • 使用多个通配符执行 Get-ChildItem 以保持相同的子目录深度
  • 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:\Test19\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