Сценарий Powershell или пакетный файл для сохранения только 4 самых последних файлов в каждом подкаталоге

Мне нужна помощь в разработке сценария, чтобы сделать следующее.

У меня есть записанные файлы Tv .WTV в подкаталогах в моей папке c:\recorded tv. например: c:\recorded tv\blacklist\ c:\recorded tv\batman\ и т. д.

Мне нужен сценарий, который я могу запланировать через планировщик задач, который удалит старые файлы wtv в соответствующем подкаталоге и сохранит только 4 самых последних файла wtv в соответствующем подкаталоге на основе даты записи.

Это возможно?


person Mickey    schedule 29.10.2014    source источник
comment
спасибо, но не так, как другие сообщения.   -  person Mickey    schedule 29.10.2014
comment
Логика в связанном посте - это то, что вы ищете. вам просто нужно применить его в цикле foreach, чтобы он работал для каждого подкаталога. Если у вас возникли проблемы с этим, обновите свой пост о том, что вы сделали, и мы можем попытаться вам помочь.   -  person Matt    schedule 29.10.2014


Ответы (2)


Приведенное ниже решение адаптировано на основе аналогичного сообщения SO в Keep x количество файлов и удалить все остальные - Powershell

$path = "c:\recorded tv"
$keep = 4

$subdirs = Get-ChildItem -Path $path | ?{ $_.PSIsContainer } | select-object FullName
foreach ($dir in $subdirs) {
    $files = Get-ChildItem -Path $dir.FullName | ?{-not $_.PsIsContainer}
    if ($files.Count -gt $keep) {
        $files | Sort-Object CreationTime | Select-Object -First ($files.Count - $keep) | Remove-Item -Force
    }
}
person Jason W    schedule 29.10.2014
comment
Спасибо. к сожалению, тот другой пост действительно решает проблемы. Мне нужно сохранить только 4 самых последних файла для КАЖДОГО подкаталога. Другой пост взял все файлы в подкаталоге и сохранил только самые последние 10 файлов. - person Mickey; 29.10.2014
comment
Джейсон, нет нужды отвечать. Вы уже отметили это сообщение. - person Matt; 29.10.2014
comment
Спасибо, Мэтт - я все еще изучаю соглашения SO... - person Jason W; 29.10.2014
comment
Микки - я отредактировал ответ, чтобы адаптировать другой пост к вашему сценарию. Надеюсь, это сработает для вас. - person Jason W; 29.10.2014

Для пакетного решения

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "root=c:\recorded tv"
    set "fileType=.wtv"
    set "keep=4"

    for /d %%d in ("%root%\*") do for /f "skip=%keep% delims=" %%a in (
        'dir /b /o-d /a-d "%%~fd\*%fileType%"'
    ) do echo del "%%~fd\%%~a"

Код выполняет два цикла for:

  • for %%d перечисляет папки в указанном корне.

  • for %%a выполняет команду dir над обрабатываемой папкой, извлекая список файлов внутри нее в обратном порядке дат. Верхние n файлов пропускаются (более новые файлы), а для остальных файлов выполняется команда del.

Операции по удалению файлов отображаются только в консоли. Если вывод правильный, удалите команду echo с префиксом del.

person MC ND    schedule 29.10.2014