从文件夹中移动和重命名特定文件,并为每个文件夹连续命名

Moving and renaming specific files from folders and naming them consecutively per folder

我需要对许多文件夹(都在同一目录中)进行排序,以移动所有 JPG 并将其重命名为 "parentfolder" +“#”,其中 "parentfolder" 是父文件夹名称,“ #" 是各自文件夹中每组文件的连续标签。

例如文件夹.\Input\MainID1a.jpg,b.jpg,c.jpg 和其他一些文件类型。 在另一个文件夹中 .\Input\MainID2 也是 a.jpg, b.jpg, c.jpg 和一些其他文件类型。

期望的输出是将所有 jps 保存在一个重命名为的文件夹中:

文件路径 新文件名
MainID1\a.jpg MainID1_1
MainID1\b.jpg MainID1_2
MainID1\c.jpg MainID1_3

然后在查看下一个文件夹时重置循环以允许:

文件路径 新文件名
MainID2\a.jpg MainID2_1
MainID2\b.jpg MainID2_2
MainID2\c.jpg MainID2_3

我找不到为每个文件夹重新启动循环的方法。目前,我的循环正在迭代整个目录的 .jpg 文件。

C:\Users\Rango\Renaming\Input> Get-ChildItem -Recurse -Filter *.jpg |
ForEach-Object {$c = 1} 
{Write-Host $_.Directory.Name $c; $c++}
{ $c = 1}

输出:

主要编号 1 1
主要编号 1 2
主要编号 1 3
主要编号 1 4
主 ID 10 5
主 ID 10 6
主 ID 10 7
主 ID 100 8
主 ID 101 9
主 ID 102 10
主 ID 102 11
主 ID 102 12
主 ID 102 13
主 ID 102 14
主 ID 102 15
主 ID 102 16
主 ID 102 17
主 ID 102 18
主 ID 102 19
主 ID 102 20
主 ID 102 21
主 ID 102 22
主 ID 103 23
主 ID 104 24
主 ID 104 25
主 ID 105 26
主 ID 105 27
主 ID 106 28
主 ID 107 29
主 ID 109 30
等等

一种方法是创建一个变量来存储上一个文件的目录名称(例如$oldName),并在更改时重置$c

Get-ChildItem -Recurse -Filter *.jpg |
ForEach-Object {
    if($_.Directory.Name -ne $oldName){$c = 1}
    Write-Host $_.Directory.Name $c; $c++
    $oldName = $_.Directory.Name
}

您可以按 directoryName 分组,并像这样在每个文件组上循环:

Get-ChildItem "c:\temp" -Recurse -File -Filter *.jpg | group DirectoryName |%{
$Dir=$_
$Cpt=1
$_.Group | %{rename-item $_.FullName -NewName ("{0}\{1}_{2}" -f $Dir.Name, (Split-Path $Dir.Name -Leaf), $Cpt++) -WhatIf}
}

备注:

  1. 在 Get-childitem 中使用 -File(否则如果包含 jpg 目录的目录是 incude)
  2. 如果您希望文件名以 001、002、003 结尾(保持相同的数字格式),请修改我的代码并将“{0}{1}_{2}”替换为“{0}{1}” _{2:d3}"
  3. 当然,如果您真的想应用此重命名命令,请删除假设