2014-01-14 153 views
0

我在具有此類命名約定的目錄中有大量文件:「[Date] [Lastname] 345.pdf」。注意:345對於所有這些文件都是恆定的批量通過重新排列文件名重命名目錄中的文件

我想重命名所有文件,以便它們讀取「[姓氏] [日期] 345.pdf」。

編輯:我在那裏開始

有一個錯字我已經取得了一些成功:

gci -Filter *.pdf| %{Rename-Item $_.fullname $_.Name.Split(" ")[1]} 

但這只不過是給了我 「[日期] .PDF」。基本上,我不知道如何使用上述命令來組合分割的兩個不同部分。我基本上想要「[1] [0] [2] .pdf」,如果這是有道理的。

謝謝。

回答

1

的另一種方法,使用正則表達式:

Get-ChildItem *.pdf | % { 
    $newName = $_.Name -replace '^(.*) (\S+) (\S+\.pdf)$', '$2 $1 $3' 
    Rename-Item $_ $newName 
} 

正則表達式擊穿:

  • ^(.*)匹配字符串的開頭任何數量的字符,並捕獲他們在一組。 [Date]在你的例子中是[Date] [Lastname] 345.pdf
  • (\S+)匹配一個或多個連續的非空白字符並在第二組中捕獲它們。 [Lastname]在你的例子中是[Date] [Lastname] 345.pdf
  • (\S+\.pdf)$匹配一個或多個連續的非空白字符,然後匹配字符串末尾的字符串.pdf並捕獲第三組中的字符串。 345.pdf在你的例子中是[Date] [Lastname] 345.pdf

該組由$1$2$3提及,所以替換字符串'$2 $1 $3'重新排序組你想要的方式。

+0

這工作!謝謝。你能解釋一下這裏發生了什麼嗎?仍在努力學習。 – user3194848

+0

@ user3194848查看已更新的答案。 –

+1

@ user3194848順便說一句,這個問題是不明確的......開始的例子意味着你想用** 302 **替換** 345 **,但是你最後說的話意味着你想保持相同數字(這是這個答案中的正則表達式)。是** 302 **錯字?如果你確實想改變數字,把替換改爲'$ _。Name -replace'^(。*)(\ S +)([^。] +)','$ 2 $ 1 302''。 –

0

給這個鏡頭。

gci *.pdf| %{ 
    $Name = $PSItem.Name.Split(' '); 
    $Dest = ('{0} {1} {2}' -f $Name[1], $Name[0], $Name[2]); 
    Move-Item $PSItem.FullName -Destination $Dest; 
}; 
+0

這一個沒有工作。在split運算符上出現錯誤「您無法在空值表達式上調用方法」。 – user3194848

+0

您使用的是什麼版本的PowerShell? 「$ PSItem」是PowerShell 3.0版本中的新增功能,因此如果您運行的是PowerShell 2.0版,那麼您將不得不使用'$ _'而不是'$ PSItem'。 –