替换PS中所有目录和文件的名称

时间:2011-12-15 10:23:22

标签: powershell renaming

我想在所有子文件夹和文件的名称中将所有空格字符替换为“_”。 不幸的是,当我输入:

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

我应该如何改进这个短代码?

3 个答案:

答案 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