2016-09-26 116 views
1

我一直在尋找所有的stackoverflow和其他在線論壇,以獲取有關PowerShell變量和重命名函數的任何幫助。我沒有運氣。如何重新排列文件名中的日期格式

我使用的文件名約定是:CompanyName 12.31.15 FS (「FS」描述了文件的內容,在本例中是財務報表)。一位數的月份前面有3個空格,這樣「FS」總是以可視方式在Windows資源管理器中直接結束)

雖然我想將其更改爲yy,但日期格式爲m.dd.yy。 mm.dd.問題是我有超過30個文件夾中有大量的文件 - 有些不遵循這個文件命名約定,但如果他們使用m.dd.yy格式,那麼文件名肯定會遵循約定。

所以這裏就是我在尋找:

  • 切換周圍的方式只能從m.dd.yy文件名的日期部分YY.MM.DD

  • 這樣做還可以刪除2個前導空格(當前有3個空格),並且在CompanyName,日期和內容之間只有一個空格。

    目前:

    CocaCola 12.31.15 FS 
    
    CocaCola 6.30.15 FS 
    

    我想:

  • 的文件必須在幾個目錄中的 「公司」 文件夾


例子內改變

CocaCola 15.12.31 FS 

CocaCola 15.06.31 FS 

回答

1

使用Get-ChildItem cmdlet檢索文件。使用Rename-Item重命名它。 要切換日期,您可以解析它並將其格式化爲所需的輸出。但是你也可以使用一個regex做的一切:

$yourCompanyPath = 'C:\tmp' 

$callback = { 
    param($match) 

    '{0} {1}.{2:D2}.{3} {4}' -f $match.Groups["CompanyName"].Value, 
     $match.Groups["Year"].Value, 
     [int]$match.Groups["Month"].Value, 
     $match.Groups["Day"].Value, 
     $match.Groups["FS"].Value 
} 

$rex = [regex]'(?<CompanyName>\S+)\s+(?<Month>\d+)\.(?<Day>\d+)\.(?<Year>\d+)\s+(?<FS>FS)' 

Get-ChildItem $yourCompanyPath | Foreach { 
    $_ | Rename-Item -NewName ('{0}{1}' -f $rex.Replace($_.BaseName, $callback), $_.Extension) 
} 

來源例如:

CocaCola 6.30.15 FS.csv 
CocaCola 12.31.15 FS.csv 

輸出:

CocaCola 15.06.30 FS.csv 
CocaCola 15.12.31 FS.csv 
+0

我測試了你的腳本兩次。它似乎適用於源代碼示例,但它在文件夾上試用時無效:它對於具有前3個空格的文件名沒有任何作用。它看起來像其他日期迭代幾次額外的時間,因爲格式結束了日,年,月。這可能是因爲我忽略了提到「FS」部分可能不只是一個單詞,它可能包含一些由.file文件之前的空格分隔的單詞。 – LordBalogh

+0

你想告訴我什麼?我回答了你的問題,因爲問題是關於文件,*不是*文件夾。 –

+0

我猜兩件事: 我希望它可以在單個文件名上工作,即使它們嵌套在文件夾中,而我的腳本也不起作用(即使只是一個文件夾的內容)。它看起來好像遍佈文件名太多次了。 – LordBalogh