如何在PowerShell中给文件名添加父文件夹前缀且避免循环?
哇,刚接触PowerShell3小时就折腾到这个地步,必须给你点个大大的赞!😆
你遇到的循环问题其实很好理解:当你直接用dir | rename-item这条命令时,dir(也就是Get-ChildItem)是动态扫描文件系统的——你重命名了一个文件之后,这个新生成的文件名会被dir再次扫到,然后脚本又会给它再加一次父文件夹名称,如此往复就陷入循环了。
给你两个简单的解决办法:
方法一:先收集所有文件再批量重命名
先把要处理的所有文件一次性抓到内存里,再统一执行重命名,这样扫描过程和重命名过程完全分离,就不会出现重复扫描的问题:
# 先获取目标文件,这里可以替换成你要处理的具体路径 # -File 表示只处理文件,-Recurse 表示遍历子文件夹,-Depth 1 可选,用来限制只处理直接子文件夹的文件 $allFiles = Get-ChildItem -Path "你的目标文件夹路径" -File -Recurse $allFiles | Rename-Item -NewName {$_.Directory.Name + $_.Name}
方法二:添加判断避免重复添加
如果担心不小心重复执行命令,也可以在重命名的脚本块里加个判断,检查文件名是否已经以父文件夹名称开头,是的话就跳过:
Get-ChildItem -File -Recurse | Rename-Item -NewName { if (-not $_.Name.StartsWith($_.Directory.Name)) { $_.Directory.Name + $_.Name } else { $_.Name # 已经加过了,保持原样 } } -WhatIf
注意这里的-WhatIf参数是用来预览操作效果的,执行后只会显示要重命名的内容,不会真的修改文件。确认没问题后,去掉-WhatIf再执行就可以了。
刚入门就能自己摸索到管道和脚本块的用法,你这进度相当快啊!继续探索下去,PowerShell绝对会成为你效率提升的利器~
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

