我有一个这样的文件列表:
测试(文件1)[文字] .TXT
测试(文件2)[文字] .TXT
测试。(文件3)[文本] .txt
我需要删除任何“()”,“[]”和任何“。”,在不更改文件扩展名的情况下替换它们。我尝试过以下但是它不起作用:
dir C:\scratch\*.txt | % { Rename-Item $_ ($_.basename -replace "\(", " "`
-replace "\)", " "`
-replace "\[", " "`
-replace "\]", " "`
-replace ".", " ")}
理想情况下,文件名应以“Test file1 text.txt”
格式结束答案 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)
答案 3 :(得分:0)
如果您不需要以编程方式执行此操作,请改用http://www.bulkrenameutility.co.uk/Screenshots.php。多年来我一直在使用它来重命名图像,以及其他一些东西!