我想在所有子文件夹和文件的名称中将所有空格字符替换为“_”。 不幸的是,当我输入:
Get-ChildItem -recurse -name | ForEach-Object { Rename-Item $_ $_.replace(" ","_") }
错误讯息:
重命名项:源和目标路径必须不同。在线:1 焦炭:60 + Get-ChildItem -recurse -name | ForEach-Object {Rename-Item<<<<< $ _ $ .replace(“”,“”)} + CategoryInfo:WriteError:(PATH_HERE)[Rename-Item],IOException + FullyQualifiedErrorId:RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand
我应该如何改进这个短代码?
答案 0 :(得分:8)
不要使用Name开关,它只输出对象的名称,而不是它们的完整路径。试试这个:
Get-ChildItem -Recurse | `
Where-Object {$_.Name -match ' '} | `
Rename-Item -NewName { $_.Name -replace ' ','_' }
答案 1 :(得分:5)
此处的问题是,如果文件名中没有空格,则名称不会更改。 Rename-Item
不支持此功能。您应该使用Move-Item
代替:
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace(" ", "_") }
此外,在你的回答中,你错过了$_.replace(...)
中的下划线以及用空字符串替换空格的地方。在我的回答中包含了这一点。
答案 2 :(得分:0)
添加过滤器对我有用:
Get-ChildItem C:\path-to-directory -Recurse -Filter *foo* | Rename-Item -NewName { $_.name -replace 'foo', 'bar'} -verbose