2012-06-27 66 views
0

我有一些文件,我想使用regex和powershell重命名,但我不確定這些文件的模式。使用正則表達式和PowerShell重命名文件名的部分

我需要重命名的文件名以及它們最終應該看起來像什麼的示例。 ps將名字放在「」中以佔空位。

如何將文件現在命名爲

「[ABS] anima.some e147名[480P] .AVI」
「anima.some e147名#anim組.AVI」
「阿尼瑪。一些e147名[480P] .AVI」
‘阿尼瑪一些e147名[480P] .AVI’

,它們應該如何命名

「動漫一些e147.avi」

+0

PowerShell的實際上是不能處理文件名以'[]'在其中,所以你需要做的不僅僅是重命名和正則表達式,就像使用一些.NET類一樣。 – SpellingD

+0

感謝您的信息,如果您可以在PowerShell中使用.NET進行這項工作,那將是一個可以接受的解決方案。 – justinf

回答

1

這個怎麼樣:

# Create array of filenames 
$files = 
"[abs] anima.some e147 name [480p].avi", 
"anima.some e147 name #anim group .avi", 
"anima.some e147 name [480p].avi", 
"anima some e147 name [480p].avi" 

# Setup patterns to match against 
$pattern1 = "\[\w+\] ([^.]+).([\w]+) ([\S]+) [\w]+ \[[\w]+\].avi" 
$pattern2 = "([^.\s]+).([\w]+) ([\S]+) .*.avi" 

# Loop through file names and attempt matching 
foreach($f in $files) 
{ 
    if($f -match $pattern1) 
    { 
     $string = (Get-Culture).TextInfo.ToTitleCase($matches[1]) + " " + $matches[2] + " " + $matches[3] + ".avi" 
     $string 
    } 
    elseif($f -match $pattern2) 
    { 
     $string = (Get-Culture).TextInfo.ToTitleCase($matches[1]) + " " + $matches[2] + " " + $matches[3] + ".avi" 
     $string 
    } 
    else 
    { 
     "unmatched file: " + $f 
    } 
} 

輸出是:

Anima some e147.avi 
Anima some e147.avi 
Anima some e147.avi 
Anima some e147.avi 
+0

非常感謝這個工作100%爲我想要插入到m代碼,它現在工作,我現在買了一本關於正則表達式的書,所以將學習。只是一個我從來沒有使用Get-Culture的問題,我檢查了PowerShell的幫助,並沒有真正解釋它。 – justinf

+0

Get-Culture返回一個System.Globalization.CultureInfo對象。該對象具有公開「ToTitleCase()」方法的TextInfo屬性。該方法只是一個方便的工具,可以將字符串轉換爲「rAmdoN cAse」並將其更改爲「Random Case」。 –

相關問題