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



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

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

所需的输出是将所有jp保存在一个重命名为的文件夹中

文件路径新文件名MainID1\a.jpg MainID1_1MainID1\b.jpg MainID1_2MainID1\c.jpg MainID1_3

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

文件路径新文件名MainID2\a.jpg MainID2_1MainID2\b.jpg MainID2_2MainID2\c.jpg MainID2_3

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

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

输出:

主ID 1 1主ID 1 2主ID 1 3主ID 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等等

您可以按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子项中使用-File(否则,如果目录包含jpg目录)
  2. 如果您希望文件名以001002003结尾(保持数字格式不变),请修改我的代码并替换"{0}{1}_{2} "发件人"{0}{1}_{2:d3}">
  3. 当然,如果你真的想应用这个重命名命令,请删除它

一种方法是创建一个变量来存储上一个文件(例如$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
}

最新更新