2009-11-25 81 views
4

我有这样的文件列表:。
测试(文件1)[文字] .txt文件
测试(文件2)[文字] .txt文件
测试(文件3) [text] .txt重命名文件删除时间在PowerShell中

我需要删除任何“()”,“[]”和任何“。”,将它们替换为空格而不更改文件扩展名。我试过以下,但它不工作:

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

理想情况下,文件名应该在格式落得“测试文件1的text.txt”

回答

6

IMO Rename-Item似乎在其处理带有[]字符的路径时被破坏。幸运的是,Move-Item的作品:

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

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

+0

这两个答案都很好,我给出了这个答案,因为更容易的正则表达式。但有一个问题:执行上述操作会留下两个空间,可能会有相邻的字符在一起。我需要添加另一个“替换”\ s +',''吗?我将如何替换字符串末尾的空格? \ z似乎没有这样做。 – fenster 2009-11-27 23:42:59

+0

在答案中查看更新后的正则表达式:[()[\\]。] - > + < - 以及Trim()的加法。 – 2009-11-27 23:53:13

6

重命名,项目不包含文件的工作“[“ 要么 ”]”。这是一个known issue

事实证明,问题是因为Rename-Item缺少-LiteralPath参数。布展项目有这个参数,所以你可以用它做你想要什么:

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

取出-WhatIf参数时,它看起来像它做你想要做的事。我的正则表达式留下了类似“测试    file1     0123.txt”的文件,这不是你想要的。

1

,你可以使用rename代替做到这一点:

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

该命令替换所有句号(时间内)的空间,不改变文件扩展名。

相关问题