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

时间:2017-11-04 10:18:27

标签: powershell loops pipeline renaming file-moving

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

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

所需的输出是将所有jps保存在重命名为:

的单个文件夹中
File Path           New File name
MainID1\a.jpg       MainID1_1
MainID1\b.jpg       MainID1_2
MainID1\c.jpg       MainID1_3

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

File Path           New File name
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}

输出:

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

2 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是创建一个变量来存储上一个文件的目录名称(例如$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
}

答案 1 :(得分:0)

您可以按目录名分组并循环每个文件组,如下所示:

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