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

Recursively Rename Files In All Subfolders Sequentially

我有一系列文件夹和子文件夹,结构如下:

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

我尝试使用几个不同的 PowerShell 示例来实现它。我有递归搜索功能,但是当我尝试重命名 ForEach-Object 循环中的文件时收到有关 InvalidOperationException 的错误。此外,恐怕我的顺序编号不是每个重命名文件的文件夹的 'reset'。

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

那么,两个问题:

  1. 如何修复 Rename-Item 的错误?
  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}
}

如果输出适合您,请删除倒数第二行中的 -whatif

其他方法

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