替换PS中所有目录和文件的名称
Posted
技术标签:
【中文标题】替换PS中所有目录和文件的名称【英文标题】:replace names of all directiories and files in PS 【发布时间】:2012-01-21 01:20:50 【问题描述】:我想在所有子文件夹和文件的名称中将所有空格字符替换为“_”。 不幸的是,当我输入时:
Get-ChildItem -recurse -name | ForEach-Object Rename-Item $_ $_.replace(" ","_")
错误信息:
Rename-Item :源路径和目标路径必须不同。在线:1 字符:60 + Get-ChildItem -recurse -name | ForEach-Object 重命名项目 .replace(" ","") + CategoryInfo : WriteError: (PATH_HERE) [Rename-Item], IOException + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand
我应该如何改进这个短代码?
【问题讨论】:
【参考方案1】:不要使用名称开关,它只输出对象的名称,而不是它们的完整路径。试试这个:
Get-ChildItem -Recurse | `
Where-Object $_.Name -match ' ' | `
Rename-Item -NewName $_.Name -replace ' ','_'
【讨论】:
不错。可能希望包含 Where-Object $_.Attributes -notmatch 'Directory' 作为附加过滤器。迭代时不能重命名目录。 @MichaelBlackburn 另一个技巧是按 FullName 降序对集合进行排序。这会强制脚本在修改目录本身之前处理目录中的所有子项。 谢谢!我在其他几个相关页面上提到了您的答案。您是唯一能够解决两个最常见问题的人。 @MichaelJ.Heier 您能否建议使用按全名排序的代码进行编辑?【参考方案2】:这里的问题是,如果文件名中没有空格,则名称不会改变。 Rename-Item
不支持此功能。你应该改用Move-Item
:
Get-ChildItem -recurse -name | ForEach-Object Move-Item $_ $_.replace(" ", "_")
此外,在您的回答中,您错过了$_.replace(...)
中的下划线以及用空字符串替换空格的位置。在我的回答中包含了这个。
【讨论】:
Move-Item :该进程无法访问该文件,因为它正被另一个进程使用。在 line:1 char:58 + Get-ChildItem -recurse -name | ForEach-Object 移动项目 @matandked 看到这个答案Get-ChildItem -Recurse | Where-Object $_.Name -match ' ' | Rename-Item -NewName $_.Name -replace ' ',''
在***.com/a/8520172找到
这是帮助我理解需要过滤器来确保名称被更改,否则如果尝试将对象重命名为相同名称时会出错【参考方案3】:
添加过滤器对我有用:
Get-ChildItem C:\path-to-directory -Recurse -Filter *foo* | Rename-Item -NewName $_.name -replace 'foo', 'bar' -verbose
【讨论】:
以上是关于替换PS中所有目录和文件的名称的主要内容,如果未能解决你的问题,请参考以下文章