You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在递归遍历父目录时重置各子文件夹层级的计数器?

为各层级文件夹添加独立序号前缀的PowerShell实现

问题场景

我编写了一个PowerShell脚本,目的是给父文件夹下的所有子文件夹添加连续序号前缀,但递归遍历过程中计数器会跨层级持续累加,无法在不同子层级自动重置为1。

测试脚本

# 创建测试文件夹结构:
ni -path $home\parent_folder -itemtype "directory"
ni -path $home\parent_folder\child_a, $home\parent_folder\child_b -itemtype "directory"
ni -path $home\parent_folder\child_a\grandchild_a, $home\parent_folder\child_b\grandchild_b -itemtype "directory"
ni -path $home\parent_folder\child_a\grandchild_a\n_child_a, $home\parent_folder\child_b\grandchild_b\n_child_b -itemtype "directory"

# 递归执行重命名:
dir $home\parent_folder -directory -recurse | foreach -begin { $i = 1 } -process { ren $_.fullname -newname ( "{0}_{1}" -f $i, $_.name ) ; $i++ }

# 输出结果:
dir $home\parent_folder -recurse | % {""} { write-host $_.fullname } {""} 

当前输出(不符合预期)

C:\Users\victo\parent_folder\1_child_a
C:\Users\victo\parent_folder\2_child_b
C:\Users\victo\parent_folder\1_child_a\3_grandchild_a
C:\Users\victo\parent_folder\1_child_a\3_grandchild_a\4_n_child_a
C:\Users\victo\parent_folder\2_child_b\5_grandchild_b
C:\Users\victo\parent_folder\2_child_b\5_grandchild_b\6_n_child_b

尝试过的低效方法

  • 嵌套foreach循环函数(扩展性差):需要手动根据文件夹层级嵌套循环,无法适配任意深度的文件夹结构
Function prefix_dir ($parent_dir) # $parent_dir 是父文件夹路径
{
    $i = 1
    foreach ($child_dir in (Get-ChildItem $parent_dir -directory))
    {
        $j = 1
        foreach ($mini_dir in (Get-ChildItem $parent_dir\$child_dir -directory))
        {
            Rename-Item $mini_dir.fullname -newname ( "{0}_{1}" -f $j, $mini_dir.name )
            $j++
        }
    Rename-Item $child_dir.fullname -newname ( "{0}_{1}" -f $i, $child_dir.name )
    $i++
    }
}

# 输出结果:
dir $home\parent_folder -recurse | % {""} { write-host $_.fullname } {""} 

输出:

C:\Users\victo\parent_folder\1_child_a
C:\Users\victo\parent_folder\2_child_b
C:\Users\victo\parent_folder\1_child_a\1_grandchild_a
C:\Users\victo\parent_folder\1_child_a\1_grandchild_a\n_child_a
C:\Users\victo\parent_folder\2_child_b\1_grandchild_b
C:\Users\victo\parent_folder\2_child_b\1_grandchild_b\n_child_b
  • 移除recurse参数,逐个进入子文件夹重复执行循环:操作繁琐,效率低下

预期输出

C:\Users\victo\parent_folder\1_child_a
C:\Users\victo\parent_folder\2_child_b
C:\Users\victo\parent_folder\1_child_a\1_grandchild_a
C:\Users\victo\parent_folder\1_child_a\1_grandchild_a\1_n_child_a
C:\Users\victo\parent_folder\2_child_b\1_grandchild_b
C:\Users\victo\parent_folder\2_child_b\1_grandchild_b\1_n_child_b

解决方案

使用递归函数处理每个文件夹层级,在进入每个父文件夹时重置计数器,实现各层级独立编号:

function Rename-FoldersWithLevelPrefix {
    param(
        [Parameter(Mandatory=$true)]
        [string]$Path
    )

    # 获取当前文件夹下的所有直接子文件夹(不递归),按名称排序保证编号顺序稳定
    $childFolders = Get-ChildItem -Path $Path -Directory | Sort-Object Name
    $counter = 1

    # 重命名当前层级的子文件夹
    foreach ($folder in $childFolders) {
        $newName = "{0}_{1}" -f $counter, $folder.Name
        $newPath = Join-Path -Path $Path -ChildPath $newName
        Rename-Item -Path $folder.FullName -Destination $newPath -Force

        # 递归处理当前子文件夹的下一级
        Rename-FoldersWithLevelPrefix -Path $newPath
        $counter++
    }
}

# 调用函数,传入父文件夹路径
Rename-FoldersWithLevelPrefix -Path "$home\parent_folder"

# 输出结果验证
Get-ChildItem -Path "$home\parent_folder" -Recurse -Directory | ForEach-Object {
    Write-Host $_.FullName
}

方案说明

  1. 递归函数Rename-FoldersWithLevelPrefix会在每个父文件夹层级重置计数器$counter为1,确保各层级编号独立
  2. 先完成当前层级文件夹的重命名,再递归进入新命名的文件夹处理下一级,避免路径失效
  3. 通过Sort-Object Name保证文件夹按名称排序后编号,确保编号顺序稳定

内容的提问来源于stack exchange,提问作者Victor A. Ortiz Solis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:08:31