【问题标题】:replace names of all directiories and files in PS替换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

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

【问题讨论】:

    标签: powershell renaming


    【解决方案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 ' ','' }stackoverflow.com/a/8520172找到
    • 这是帮助我理解需要过滤器来确保名称被更改,否则如果尝试将对象重命名为相同名称时会出错
    【解决方案3】:

    添加过滤器对我有用:

    Get-ChildItem C:\path-to-directory -Recurse -Filter *foo* | Rename-Item -NewName { $_.name -replace 'foo', 'bar'} -verbose
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-01
      • 2012-05-13
      • 1970-01-01
      • 2014-03-07
      • 2020-08-14
      • 2010-11-22
      • 2023-01-04
      • 1970-01-01
      相关资源
      最近更新 更多