正如主题所说,我需要通过在目录名称前添加前缀来重命名文件夹中的每个文件。我尝试过这个,但它似乎一遍又一遍地处理每个文件,直到出现错误
gci | Where {$_.psIsContainer -eq $false} | Rename-Item -NewName {$_.Directory.Name + " " + $_.Name}
理想情况下,我希望它以递归方式工作
短暂性脑缺血发作
答案1
在管道中使用Get-ChildItem
和的一个问题是,调用不断从同一个目录抓取文件...并且经常会将重命名的文件视为尚未输入管道的文件。Rename-Item
G-CI
这可能会导致同一个文件被多次操作。[咧嘴笑]
解决方案是将调用括G-CI
在括号中,以便一次性抓取所有文件,然后然后将它们一次一个地送入管道。
另外,您可以使用-File
参数G-CI
来避免Where-Object
代码中的过滤器。
另外,您还可以使用-Recurse
参数来G-CI
遍历整个目录树。
这让我想到了下面的代码。
你的……
gci | Where {$_.psIsContainer -eq $false} | Rename-Item -NewName {$_.Directory.Name + " " + $_.Name}
我的版本和你的一样……
(Get-ChildItem -File -Recurse) |
Rename-Item -NewName {$_.Directory.Name + ' ' + $_.Name}
还有一些其他我认为有价值的变化……
G-CI
在调用中指定一个路径,
我对此很谨慎,这取决于操作系统或 PoSh 可能认为的“当前目录”。[咧嘴笑]- 用一些对我来说感觉更强大的东西来构建新文件名
我会使用-f
字符串格式运算符来构建字符串,而不是有时不确定的+
连接运算符。