我制作了一个脚本来向父文件夹中的所有文件夹添加顺序前缀,但尽管计数器处于与其父文件夹不同的级别,但计数器仍不断增加,例如...
测试脚本:
# 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
我找到了两种方法来处理这个问题,但没有一种方法像我希望的那样有效......
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。所有内容都在一个脚本中,类似于第一个循环,递归。我知道我可能在这里错过了一个大概念,但我认为是时候寻求帮助了。
我想要的输出是:
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
正如 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++
}
}