2016-09-26 115 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