如何在文件名中重新排序日期格式

时间:2016-09-26 06:29:24

标签: date powershell rename wildcard filenames

我一直在网上查看stackoverflow和其他论坛,以获得有关PowerShell变量和重命名功能的任何帮助。我没有运气。

我使用的文件名约定是:CompanyName 12.31.15 FS (“FS”描述文件的内容,在本例中为财务报表)。单个数字的月份前面有3个空格,因此“FS”总是在Windows资源管理器中以可视方式结束在同一列中。)

日期格式为m.dd.yy,但我想将其更改为yy.mm.dd.问题是我有超过30个文件夹,其中包含大量文件 - 有些不遵循此文件命名约定,但如果它们使用m.dd.yy格式,则文件名肯定遵循约定。

所以这就是我要找的东西:

  • 一种只将文件名的日期部分从m.dd.yy切换到yy.mm.dd的方法

  • 这样做时,还要删除2个前导空格(当前有3个空格),并且在CompanyName,date和content之间只有一个空格。

  • 必须在“公司”文件夹

  • 中的多个目录中更改文件

示例:

目前:

CocaCola 12.31.15 FS

CocaCola  6.30.15 FS

我想:

CocaCola 15.12.31 FS

CocaCola 15.06.31 FS

1 个答案:

答案 0 :(得分: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