如何递归处理子文件夹?批量移除1TB数据的文件名与文件夹名空格
解决PowerShell递归移除文件和文件夹名称空格的问题
嘿,我明白你的问题了——当前代码只能处理顶层的文件和文件夹,没法深入子目录对吧?别担心,调整几个参数再注意下处理顺序就能搞定。
首先说说你现有代码的局限:Get-ChildItem默认只遍历目标路径的顶层内容,没有递归逻辑;而且如果同时处理文件和文件夹,可能会因为文件夹先改名导致后续文件的路径失效,所以得分开处理,还要注意处理顺序。
步骤1:递归处理所有文件
先搞定所有子目录里的文件,用-File指定只操作文件,-Recurse让PowerShell深入所有子文件夹:
Get-ChildItem -Path "C:\users\admin2\desktop\ProjectTest" -File -Recurse | Rename-Item -NewName { $_.Name -replace ' ','' }
这个命令会遍历目标路径下所有层级的文件,把每个文件名里的空格替换成空字符串。
步骤2:从最深层开始处理文件夹
处理文件夹要特别注意:必须从最底层的子文件夹开始往上改,不然先改上层文件夹名字的话,下层文件夹的路径会失效,PowerShell就找不到它们了。我们可以用Sort-Object按文件夹深度倒序排序,确保最深的文件夹先被重命名:
Get-ChildItem -Path "C:\users\admin2\desktop\ProjectTest" -Directory -Recurse | Sort-Object { $_.FullName.Split('\').Count } -Descending | Rename-Item -NewName { $_.Name -replace ' ','' }
这里-Directory指定只操作文件夹,Sort-Object通过拆分路径的分隔符数量判断文件夹深度,-Descending让最深的文件夹排在前面优先处理。
安全测试小技巧
实际执行重命名前,你可以加上-WhatIf参数预览操作效果,不会真的修改文件名,避免误操作:
# 预览文件重命名 Get-ChildItem -Path "C:\users\admin2\desktop\ProjectTest" -File -Recurse | Rename-Item -NewName { $_.Name -replace ' ','' } -WhatIf # 预览文件夹重命名 Get-ChildItem -Path "C:\users\admin2\desktop\ProjectTest" -Directory -Recurse | Sort-Object { $_.FullName.Split('\').Count } -Descending | Rename-Item -NewName { $_.Name -replace ' ','' } -WhatIf
确认预览结果符合预期后,再去掉-WhatIf执行实际操作就好。
内容的提问来源于stack exchange,提问作者K.Sutton
相关产品推荐
相关产品推荐

