按顺序递归重命名所有子文件夹中的文件

时间:2016-11-12 01:38:02

标签: windows powershell recursion file-rename

我有一系列文件夹和子文件夹,以这种方式构建:

  • 001 / Fabric / Blue /(.jpg文件,按顺序命名)
  • 001 / Fabric / Green /(.jpg文件,按顺序命名)
  • 002 / Fabric / Blue /(.jpg文件,按顺序命名)
  • 002 / Fabric / Green /(.jpg文件,按顺序命名)

文件名包含我想删除的多余字符串字符,我想将其文件名转换为更简单的顺序格式(0.jpg,1.jpg等)。

我尝试使用一些不同的PowerShell示例来实现此功能。我有递归搜索功能,但是当我尝试重命名InvalidOperationException循环中的文件时,我收到有关ForEach-Object的错误。此外,我担心我的顺序编号没有被重置'对于重命名文件的每个文件夹。

$i = 0
Get-ChildItem -Filter "*.jpg" -Recurse | ForEach-Object {
    Rename-Item $_ -NewName ('$i.jpg' -f $i++)
}

所以,有两个问题:

  1. 如何使用Rename-Item
  2. 修复错误
  3. 如何确保我的变量在脚本开始重命名文件的每个子文件夹中重置?

2 个答案:

答案 0 :(得分:2)

如果采取两步方法,首先获取包含jpg的所有文件夹然后遍历此列表,从1开始就没有问题。但是我总是使用前导零进行重新编号。

$BaseFld = "Q:\Test\"
$Ext = "*.jpg"
$jpgFolders = gci $($BaseFld+$Ext) -Recurse | 
   Select -ExpandProperty Directory -Unique |
   select -ExpandProperty Fullname | Sort

ForEach ($Folder in $jpgFolders) {
  Set-location $Folder
  $i = 1
  Get-ChildItem $Ext | %{Ren $_ -NewName ('{0:D4}.jpg' -f $i++) -whatif}
}

如果ouptut适合你,请删除最后一行的-whatif

答案 1 :(得分:0)

其他方法

$rootdir="C:\temp"
gci $rootdir -Recurse -Directory | %{$i=1; gci $_.FullName -Recurse -File -Filter "*.jpg" | %{Ren $_.FullName -NewName ('{0}.jpg' -f $i++)} }