2009-11-25 65 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 ' ' * 

該命令替換所有句號(時間內)的空間,不改變文件擴展名。

相關問題