【问题标题】:Renaming files to remove periods in Powershell重命名文件以删除 Powershell 中的句点
【发布时间】:2009-11-25 20:24:20
【问题描述】:

我有一个这样的文件列表:
测试.(file1)[文本].txt
测试.(file2)[文本].txt
测试.(file3)[文本].txt

我需要删除所有“()”、“[]”和任何“.”,在不更改文件扩展名的情况下替换它们的空格。我尝试了以下方法,但它不起作用:

dir C:\scratch\*.txt | % { Rename-Item $_ ($_.basename -replace "\(", " "`
            -replace "\)", " "`
            -replace "\[", " "`
            -replace "\]", " "`
            -replace ".", " ")}

理想情况下,文件名应以“Test file1 text.txt”格式结束

【问题讨论】:

    标签: powershell file


    【解决方案1】:

    IMO Rename-Item 在处理带有 [ ] 字符的路径方面似乎被破坏了。幸运的是,Move-Item 有效:

    dir *.txt | 
        mi -dest {($_.Basename -replace '[()[\].]+',' ').Trim() + $_.Extension}
    

    mi 是 Move-Item 的别名。请注意,Rename-Item 和 Move-Item 等许多 cmdlet 可以直接通过管道传输,然后它们的 NewName/Destination 参数可以采用脚本块,您可以在其中使用管道对象。这在内部适用于管道绑定参数,因为 PowerShell 将执行脚本块并尝试将结果强制转换为参数预期的类型。

    【讨论】:

    • 两个答案都很好,我给出了这个答案,因为正则表达式更简单。但是有一个问题:运行上述命令会留下两个空格,其中可能有相邻的字符。我需要添加另一个 -replace '\s+', '' 吗?我将如何替换字符串末尾的空格? \z 似乎没有这样做。
    • 在答案中查看更新的正则表达式:[()[\].]-->+
    【解决方案2】:

    Rename-Item 不适用于包含“[”或“]”的文件。这是known issue

    原来问题是因为 Rename-Item 缺少 -LiteralPath 参数。 Move-Item 有这个参数,所以你可以用它来做你想做的事:

    ls C:\scratch\*.txt | 
        % { Move-Item -literalpath $_.fullname `
            ($_.name -replace "[()\[\]]|\.(?!\w{3}$)", " ") -whatif }
    

    当 -WhatIf 参数看起来正在执行您希望它执行的操作时,请删除它。我的正则表达式会留下像“Test  file1  text.txt”这样的文件,这不是您想要的。

    【讨论】:

      【解决方案3】:

      您可以改用rename

      $ rename --regex --find '\.(?!\w+$)' --replace ' ' *
      

      此命令用空格替换所有句号(句点),而不更改文件扩展名。

      【讨论】:

        【解决方案4】:

        如果您不需要以编程方式执行此操作,请改用http://www.bulkrenameutility.co.uk/Screenshots.php。多年来,我一直在使用它来重命名图像以及其他一些东西!

        【讨论】:

          猜你喜欢
          • 2017-08-18
          • 1970-01-01
          • 1970-01-01
          • 2015-03-09
          • 1970-01-01
          • 2020-05-26
          • 2019-01-06
          • 2015-11-26
          • 1970-01-01
          相关资源
          最近更新 更多