重命名文件以删除Powershell中的句点

时间:2009-11-25 20:24:21

标签: powershell file

我有一个这样的文件列表:
测试(文件1)[文字] .TXT
测试(文件2)[文字] .TXT
测试。(文件3)[文本] .txt

我需要删除任何“()”,“[]”和任何“。”,在不更改文件扩展名的情况下替换它们。我尝试过以下但是它不起作用:

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

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

格式结束

4 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:6)

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”这样的文件,这不是你想要的。

答案 2 :(得分:1)

您可以使用rename来代替:

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

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

答案 3 :(得分:0)

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