Powershell 在每个文件名前加上其所在目录的名称

Powershell 在每个文件名前加上其所在目录的名称

正如主题所说,我需要通过在目录名称前添加前缀来重命名文件夹中的每个文件。我尝试过这个,但它似乎一遍又一遍地处理每个文件,直到出现错误

gci | Where {$_.psIsContainer -eq $false} | Rename-Item -NewName {$_.Directory.Name + " " + $_.Name}

理想情况下,我希望它以递归方式工作

短暂性脑缺血发作

答案1

在管道中使用Get-ChildItem和的一个问题是,调用不断从同一个目录抓取文件...并且经常会将重命名的文件视为尚未输入管道的文件。Rename-ItemG-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字符串格式运算符来构建字符串,而不是有时不确定的+连接运算符。

相关内容