我有一个这样的文件列表:
Test.(file1)[text] .txt
Test.(file2)[text] .txt
Test.(file3)[text] .txt
我需要删除任何"()","[]"和任何".",在不更改文件扩展名的情况下替换它们.我尝试过以下但是它不起作用:
dir C:\scratch\*.txt | % { Rename-Item $_ ($_.basename -replace "\(", " "`
-replace "\)", " "`
-replace "\[", " "`
-replace "\]", " "`
-replace ".", " ")}
Run Code Online (Sandbox Code Playgroud)
理想情况下,文件名应以"Test file1 text.txt"格式结束
IMO Rename-Item在处理带有[]字符的路径方面似乎被打破了.幸运的是,Move-Item有效:
dir *.txt |
mi -dest {($_.Basename -replace '[()[\].]+',' ').Trim() + $_.Extension}
Run Code Online (Sandbox Code Playgroud)
miMove-Item的别名在哪里.请注意,Rename-Item和Move-Item等多个cmdlet可以直接通过管道传输,然后它们的NewName/Destination参数可以使用可以使用管道对象的脚本块.在内部,这适用于管道绑定参数,因为PowerShell将执行脚本块并尝试将结果强制转换为参数所期望的类型.
Rename-Item不适用于包含"["或"]"的文件.这是一个已知问题.
事实证明问题是因为Rename-Item缺少-LiteralPath参数.Move-Item有此参数,因此您可以使用它来执行您想要的操作:
ls C:\scratch\*.txt |
% { Move-Item -literalpath $_.fullname `
($_.name -replace "[()\[\]]|\.(?!\w{3}$)", " ") -whatif }
Run Code Online (Sandbox Code Playgroud)
当看起来它正在执行您想要的操作时,删除-WhatIf参数.我的正则表达式留下了像"Test file1 text.txt"这样的文件,这不是你想要的.