Это первое наполовину понятное описание (от вас и ваших нескольких коллег) задачи, которую нужно выполнить.
Позвольте мне попытаться перевести:
- Файлы в исходной папке должны быть сгруппированы по году, извлеченному из
имя файла
- все файлы должны быть заархивированы, кроме самого нового из каждой группы (определяется 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
}