Имя файла, год и дата последнего изменения - PullRequest
0 голосов
/ 30 июня 2018

На основе года в имени файла - максимальное количество файлов с последними изменениями, которые должны быть там и оставшиеся для перемещения в архив.

Пример: в 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 голосов
/ 30 июня 2018

Это первое наполовину понятное описание (от вас и ваших нескольких коллег) задачи, которую нужно выполнить.

Позвольте мне попытаться перевести:

  • Файлы в исходной папке должны быть сгруппированы по году, извлеченному из имя файла
  • все файлы должны быть заархивированы, кроме самого нового из каждой группы (определяется LastWriteDate)

Un проверенный скрипт

$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

Промежуточный результат после Group-Object (на моем 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}

ИЗМЕНИТЬ, чтобы следовать светится с подсказка
здесь вариант извлечения года с помощью регулярного выражения с использованием (группа захвата)

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
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...