文件名,年份和上次修改日期

时间:2018-06-30 12:18:23

标签: powershell

基于文件名中的年份-保留的最大上次修改日期文件,剩余的将移至存档。

示例:2016年应该有1个文件,应该将其归档到2017年。

我尝试过

$sourcedir = 'C:\Users\garang\Documents\input_files\Advisory_rate'
$destdir   = 'C:\Users\garang\Documents\input_files\Advisory_rate\Archive'
Get-ChildItem -File -Path $sourcedir |
    Sort-Object {$_.Basename.Split('-')[1,0]} 

Select-Object -Skip 1 | Move-Item -Destination $destdir -Force
Mode       Last Modified date       Length     Filename

-a---         6/25/2018  12:08 AM      31744 abc_2016_2 - Copy - Copy.xls
-a---         6/25/2018  12:07 AM      31744 abc_2016_2 - Copy.xls
-a---         6/25/2018  12:06 AM      31744 abc_2017_1.xls
-a---         6/25/2018  12:07 AM      31744 abc_2017_2.xls
-a---         6/25/2018  12:05 AM      31744 abc_2017_3.xls

以动态形式而不是硬编码形式提出建议。

1 个答案:

答案 0 :(得分:0)

这是您和您的几位同事对您要完成的任务的第一条可理解的描述。

让我尝试翻译:

  • 源文件夹中的文件应按照从 文件名
  • 除了每个组中的最新文件(由LastWriteDate确定)以外,所有文件都应存档

未经测试的脚本

$sourcedir = 'C:\Users\garang\Documents\input_files\Advisory_rate'
$destdir   = 'C:\Users\garang\Documents\input_files\Advisory_rate\Archive'

Get-ChildItem -File -Path $sourcedir*.xls |
  Group-Object {$_.Basename.Split('_')[1]} | ForEach-Object {
    $_.Group | Sort-Object LastWriteTime -Descending |
      Select-Object -Skip 1 | Move-Item -Destination $destdir -Force -WhatIf
  }

要首先检查结果,我将参数-WhatIf添加到了Move-Item。
如果一切正常,请删除-WhatIf

组对象之后的中间结果(在我的ramdrive A:上):

Count Name  Group
----- ----  -----
    2 2016  {A:\abc_2016_2 - Copy - Copy.xls, A:\abc_2016_2 - Copy.xls}
    3 2017  {A:\abc_2017_1.xls, A:\abc_2017_2.xls, A:\abc_2017_3.xls}

编辑以遵循lithint
这里是使用(捕获组)使用正则表达式提取年份的一种变体

Get-ChildItem -File -Path $sourcedir*.xls |
  Where-Object BaseName -match '_(20\d{2})_\d' |
    Group-Object {$Matches[1]} | ForEach-Object {
      $_.Group | Sort-Object LastWriteTime -Descending |
        Select-Object -Skip 1 | Move-Item -Destination $destdir -Force -WhatIf
    }