2012-06-20 26 views
0

我有一長串以'yyyyMMdd'格式結尾的文件,需要將它們更改爲'MMM-yy'。什麼是解決這個問題的最好方法?重命名文件 - 在文件名內將'yyyyMMdd'轉換爲'MMM-yy'

例如 'file_one_20120620.pdf'> 'file_one_JUN-12.pdf'

  1. 找到 '日期' 使用正則表達式
  2. 提取&操縱日期
  3. 重命名文件

喬伊建議低於Powershell的腳本,看起來它應該可以工作,但即使在改變提供的代碼時,我仍然會碰壁。任何幫助將是偉大的,謝謝!

+1

我不認爲你可以轉換隻有正則表達式,從數字到文本的月份。 – nhahtdh

+1

聽起來很危險。如果你有兩個文件,一個叫20120620,一個叫20120605?會有碰撞。你的文件每個月是否唯一? –

+0

@nhahtdh - 我不認爲我可以,因爲我不能從空中拉文字 - http://stackoverflow.com/questions/5433313/convert-dd-mm-yyyy-to-mm-dd-yyyy -in-javascript - 也許如果我可以做類似於Sylvain Defresne在VBA函數中的答案嗎? –

回答

4

您可以使用PowerShell做到這一點:

gci | # get files 
    foreach { 
    $newName = [Regex]::Replace($_.BaseName, '\d{8}$', { 
     param($m) 
     [datetime]::ParseExact($m.Value, 'yyyyMMdd', $null).ToString('dd-MMM') 
    }) + $_.Extension 
    Rename-Item $_ $newName 
    } 
+0

看起來很完美,現在就試試吧 –

+0

它似乎並沒有工作,只將其中一個文件改爲'.pdf',其餘部分失敗 –

+1

Hm;正則表達式部分正常工作(這是我最懷疑的)。不過,在這種情況下,您應該在Rename-Item上使用'-WhatIf'來防止數據丟失。我會在幾分鐘內嘗試是否可以解救。 – Joey

1
Get-ChildItem | # get files 
foreach { 
$newName = [Regex]::Replace($_.BaseName, '\d{8}$', { 
    param($m) 
    [datetime]::ParseExact($m.Value, 'yyyyMMdd', $null).ToString('dd-MMM') 
}) + $_.Extension 
Rename-Item $_ $newName -WhatIf 
$_ 
$newname 
} 

這曾與我的測試列表中所有我做的是改變GCI得到-childItem ..

如果什麼:執行操作「重命名文件「on Target」項目:C:\ ab \ file_four_20120701.txt目標:C:\ ab \ file_four_01-Jul.txt「。

如果執行操作「重命名文件」目標「項目:C:\ ab \ file_one_20120620.txt目標:C:\ ab \ file_one_20-Jun.txt」。

如果發生以下情況該怎麼辦?在目標文件上執行操作「重命名文件」項目:C:\ ab \ file_three_20120622.txt目標:C:\ ab \ file_three_22-Jun.txt。

如果:執行操作目標 「重命名文件」, 「項目:C:\ AB \ file_two_20120621.txt目的地:C:\ AB \ file_two_21-Jun.txt」。

+0

是的,我真的不能告訴你爲什麼它不適合我。無論哪種方式,我發佈了最終爲我的場景工作的黑客答案。感謝您的輸入伴侶。 –

0

這對我的情況有幫助,這要歸功於上面的Joey

基於以下文件命名約定:

'file_one_20120622.pdf' 轉換爲 'file_one_JUN-22.pdf'

gci | #get files 
    foreach { 
    $newDate = [DateTime]::ParseExact($_.Name.Split('_')[2].Split('.')[0],'yyyyMMdd',$null).ToString('MMM-yy').ToUpper() 
    $newFilename = $_.Name.Split('_')[0] + '_' + $_.Name.Split('_')[1] + '_' + $newDate + ".pdf" 
    Rename-Item $_ $newFilename -WhatIf 
    }