2013-02-24 105 views
4

我有一堆文件的名稱以數字開頭,可能在兩個數字之一後面包含空格和破折號,然後有時(有時不)在第一個字母字符之前有一個空格名字我想保留,即:Powershell腳本重命名文件

2-01茫然和Confused.txt(我要進行重命名,茫然和Confused.txt)

或者

02 - Salty.txt叔叔(我想要將其重命名爲Uncle Salty.txt)

02,夜Before.txt(我要重新命名夜Before.txt)

+0

列表腳本會得到文件的列表從一個目錄並重命名它們。 – user577651 2013-02-24 08:52:53

回答

4
dir c:\tmp | % { 
    mv $_.FullName $(Join-Path $_.Directory ($_.Name -replace "^([0-9\-\s]*)",'').Trim()); 
} 

如果您需要處理遞歸YourDirectory,dir之後添加-recurse

+0

這不適用於第二個示例。嘗試用'^([0-9 \ - \ s] *)'代替 – 2013-02-24 12:13:33

+0

積分。回答更新 – muhmud 2013-02-24 12:23:29

+0

這對我需要重命名的600多個文件中的大約95%有效。第一次在我想重命名的關於將文件移動到相同文件夾的文件的子集上運行時發生錯誤,但它重命名了文件。我第二次在整套文件上運行腳本時,它並沒有給我一個錯誤。謝謝你,偉大的劇本。 – user577651 2013-02-26 06:36:11

0

嘗試這樣:

$re = '^\d+\s*-\d*\s*(.*)$' 
$recurse = $false 

Get-ChildItem "C:\some\folder" -Recurse:$recurse | ? { 
    -not $_.PSIsContainer -and $_.Name -match $re 
} | % { 
    Move-Item $_.FullName (Join-Path $_.Directory $matches[1]) 
} 

如果你想連字符是可選的變化正則表達式'^\d+\s*-?\d*\s*(.*)$'

如果要遞歸到子文件夾,請將$recurse更改爲$true

+0

這一個改變了大部分文件,但大約15%沒有重命名。 – user577651 2013-02-26 06:37:55

+0

@ user577651這15%的文件名稱是什麼樣的? – 2013-02-26 08:32:32

6

Move-ItemRename-Item的cmdlet可以直接從管道接受源和使用腳本塊提供了一個新的名字:

dir | Move-Item -Destination { $_.Name -replace '^([0-9\-\s]*)' } 

dir | Rename-Item -NewName { $_.Name -replace '^([0-9\-\s]*)' }