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

fen*_*ter 4 powershell file

我有一个这样的文件列表:
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"格式结束

Kei*_*ill 7

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将执行脚本块并尝试将结果强制转换为参数所期望的类型.


Jef*_*man 6

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