Я думаю, что это должно удовлетворить ваши потребности:
$Files = Get-ChildItem *.txt
$ProjectFiles = $Files | ForEach-Object {
$FileName = $_.Name -Split '\.'
[pscustomobject]@{
Name = $_.Fullname
RandomString = $FileName[0]
ProjectNumber = $FileName[1]
DateTime = [datetime]::parseexact($FileName[2] + $FileName[3], 'yyyyMMddHHmmss', $null)
}
}
$FilesToRemove = ($ProjectFiles | Group-Object 'ProjectNumber') | ForEach-Object {
($_.Group | Sort-Object DateTime -Descending | Select-Object -Skip 1).Name
} | Where-Object { $_ -ne $null }
$FilesToRemove | Remove-Item -WhatIf
При этом извлекаются все текстовые файлы, а затем создается новый пользовательский объект PowerShell с именем файла и свойствами, которые вы указали в имени файла.разделив на «.».Мы преобразуем строки даты и времени в объект datetime
с помощью метода parseexact
.
Затем мы можем использовать этот новый объект для группировки файлов по номеру проекта, а затем выполнить каждый из этихгруппирует сортировку результатов по дате, пропуская первый результат (который должен быть самым новым датированным файлом проекта) и возвращая имя всех остальных.
Затем мы можем удалить эти имена файлов с помощью Remove-Item
.Когда вы довольны тем, что делаете то, что ожидаете, удалите -WhatIf
.
Обратите внимание, что этот код предполагает:
- В вашем каталоге содержатся только файлы * .txt с этими файлами инет других
- В файлах всегда указан шаблон имени файла, который вы указали
- Дата и время всегда соответствуют указанному вами формату, например, 24-часовой двузначный код и т. д.
- Вы используете это на PowerShell версии 3 или новее.