如何在递归访问父目录的循环中重置每个子文件夹级别内的计数器?

问题描述 投票:0回答:1

我制作了一个脚本来向父文件夹中的所有文件夹添加顺序前缀,但尽管计数器处于与其父文件夹不同的级别,但计数器仍不断增加,例如...

测试脚本:

# Create sample folders:
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"

# Run loop recursively:
dir $home\parent_folder -directory -recurse | foreach -begin { $i = 1 } -process { ren $_.fullname -newname ( "{0}_{1}" -f $i, $_.name ) ; $i++ }

# Print output:
dir $home\parent_folder -recurse | % {""} { write-host $_.fullname } {""} 

# Output:
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

我找到了两种方法来处理这个问题,但没有一种方法像我希望的那样有效......

  1. 嵌套 foreach 循环函数(不可扩展):
Function prefix_dir ($parent_dir) # $parent_dir is the path to parent_folder
{
    $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++
    }
}

# Print output:
dir $home\parent_folder -recurse | % {""} { write-host $_.fullname } {""} 

# Output:
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

从最后一级文件夹上方的函数可以看出,它不受影响,因为需要另一个 foreach 循环(使用另一个计数器/迭代器)。我必须根据文件夹的级别手动嵌套循环 - 显然不值得。

  1. 另一种方法是在第一个循环(在“测试脚本”上)中省略 recurse 参数,并使用 cd 或 sl (Set-Location 的别名)访问每个子文件夹并再次运行循环,仅影响当前目录。

我的目标是能够将前缀添加到给定父文件夹内的所有文件夹,并将每个子级别中的计数器重置为1。所有内容都在一个脚本中,类似于第一个循环,递归。我知道我可能在这里错过了一个大概念,但我认为是时候寻求帮助了。

我想要的输出是:

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
windows powershell loops foreach automation
1个回答
0
投票

正如 mclayton 的有用评论所建议的:

Function prefix_dir($Folder = '.') {
    $Folder = Get-Item $Folder
    $Index = 1
    Get-ChildItem -Directory $Folder | ForEach-Object {
        prefix_dir $_
        Rename-Item -WhatIf $($_.FullName) "$Folder\$($Index)_$($_.Name)"
        $Index++
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.