替换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中所有目录和文件的名称的主要内容,如果未能解决你的问题,请参考以下文章

Java一键批量替换掉文件夹以及子文件的名称

Java一键批量替换掉文件夹以及子文件的名称

Bash 递归替换名称上的许多空格

PowerShell 在不同目录中查找和替换

Linux查找整个目录下包含关键词的文件并全局替换文件内容

在所有子目录中的文件中查找和替换文本[重复]