Как я могу автоматически удалить старые файлы на основе их имен? - PullRequest
0 голосов
/ 27 сентября 2018

У меня проблема с программным обеспечением, генерирующим много файлов.Я не могу контролировать генерацию файлов, но могу справиться с ними после.Файлы имеют такие имена:

"RandomString". * ProjectNumber *. * Дата *. * Время * .txt

Например:

1297729137.0004202.20180925.232147.txt

Я хочуоставить для того же ProjectNumber только последний сгенерированный файл TXT.

Есть идеи, как мне это легко сделать?

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Подход похож на Mark Wragg, но с использованием

  • a Where-Object с группами соответствия и захвата для разделения элементов имени файла.
  • a Select-Object для добавлениярассчитанные значения PN и DT для ProjectName и DateTime
  • , группировка по ProjectName
  • , развертывание группы, сортировка по DateTime по убыванию и пропуск первой (самой новой), чтобы сохранить ее
  • , удаливдругой с параметром -WhatIf, чтобы показать, что будет удалено.

Get-ChildItem *.txt | Where-Object Name -match '^(([^\.]+)\.){4}txt$' |
  Select-Object *,@{n='PN';e={$Matches[2]}},@{n='DT';e={$Matches[3]+$Matches[4]}} |
    Group-Object PN |
      ForEach-Object{ $_.Group | sort DT -desc | select -skip 1 | RM -Whatif }
0 голосов
/ 27 сентября 2018
@echo off
setlocal EnableDelayedExpansion

rem Search files, keep the last one by project
for /F "tokens=1-4 delims=." %%a in ('dir /B *.txt') do (
   if "%%c%%d" gtr "!project[%%b]!" set "project[%%b]=%%c%%d"
)

rem Remove the rest of files
for /F "tokens=1-4 delims=." %%a in ('dir /B *.txt') do (
   if "%%c%%d" neq "!project[%%b]!" del "%%a.%%b.%%c.%%d.txt"
)

Этот метод предполагает, что именно такие файлы существуют в папке;если нет, просто измените шаблон на *.*.*.*.txt

0 голосов
/ 27 сентября 2018

Я думаю, что это должно удовлетворить ваши потребности:

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