Перейти к содержимому
www.mytechnote.ru
Меню
  • Администрирование
    • Скрипты
  • Оборудование
    • Обзоры
    • Инструкции
  • Прочее
  • Русский
    • English
    • Русский
Меню

Автоматическое удаление старых файлов [скрипт PowerShell]

Хочу сегодня показать вам очередной скрипт PowerShell. В этот раз – для удаления старых файлов и пустых папок. Такой скрипт может пригодиться для отчистки, например файловых серверов, или каких-нибудь временных или обменных папок.

Скачать скрипт можно тут. Скрипт на GitHub.

Текст скрипта:

$Now = Get-Date
$Days = "7"
$TargetFolder = "C:\Users\sanglyb\Documents\"
$Extension = "*"
$LastWrite = $Now.AddDays(-$Days)
$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | Where{$_.CreationTime -le "$LastWrite" -and $_.LastWriteTime -le "$LastWrite"} | Sort-Object -Descending {$_.FullName.Split('\').Count},FullName
foreach ($File in $Files)
{
 if ($File -ne $NULL -and !$File.PSIsContainer)
 {
  write-host "Deleting File $File" -ForegroundColor "Magenta"
  Remove-Item $File.FullName -Force | out-null
 }
 elseif ($File -ne $NULL -and $File.PSIsContainer)
 {
        $FolderInfo = get-Childitem $File.FullName | Measure-Object
        if ($folderInfo.count -eq 0)
        {
            write-host "Deleting directory - $File" -foregroundcolor "green"
            Remove-Item $File.FullName -Force | out-null
        }
 }
 else
 {
  Write-Host "No more files to delete!" -foregroundcolor "Green"
 }
 }
 #удаляем пустые папки, не зависимо от времени создания
 $folderInfo=""
 $Folders = Get-Childitem $TargetFolder -Recurse | Where{$_.PSIsContainer} | Sort-Object -Descending {$_.FullName.Split('\').Count},FullName
 foreach ($Folder in $Folders)
 {
    if ($Folder -ne $null)
    {
        $FolderInfo = get-Childitem $Folder.FullName | Measure-Object
        if ($folderInfo.count -eq 0)
        {
            write-host "Deleting directory - $Folder" -foregroundcolor "yellow"
            Remove-Item $Folder.FullName -force | out-null
        }
    }
 }

Пару слов, о том, что тут происходит.

$Days = "7"
$TargetFolder = "C:\Users\sanglyb\Documents\"
$Extension = "*"

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

$LastWrite = $Now.AddDays(-$Days)
$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | Where{$_.CreationTime -le "$LastWrite" -and $_.LastWriteTime -le "$LastWrite"} | Sort-Object -Descending {$_.FullName.Split('\').Count},FullName

В этом участке мы находим все файлы, которые подходят под наши критерии. А также сортируем список, что бы всё шло от большего пути к меньшему. Это нужно, если у вас будут вложенные папки, что бы скрипт всегда сперва удалял файлы, а потом уже пытался удалить папку, где расположены эти папки.

foreach ($File in $Files)
{
 if ($File -ne $NULL -and !$File.PSIsContainer)
 {
  write-host "Deleting File $File" -ForegroundColor "Magenta"
  Remove-Item $File.FullName -Force | out-null
 }

Собственно, удаляем файл.

elseif ($File -ne $NULL -and $File.PSIsContainer)
 {
                               $FolderInfo = get-Childitem $File.FullName | Measure-Object
                               if ($folderInfo.count -eq 0)
                               {
                                               write-host "Deleting directory - $File" -foregroundcolor "green"
                                               Remove-Item $File.FullName -Force | out-null
                               }
 }

Тут мы удаляем папку, но перед ее удалением, проверяем, что бы она была пустая.

$folderInfo=""
 $Folders = Get-Childitem $TargetFolder -Recurse | Where{$_.PSIsContainer} | Sort-Object -Descending {$_.FullName.Split('\').Count},FullName
 foreach ($Folder in $Folders)
 {
                if ($Folder -ne $null)
                {
                               $FolderInfo = get-Childitem $Folder.FullName | Measure-Object
                               if ($folderInfo.count -eq 0)
                               {
                                               write-host "Deleting directory - $Folder" -foregroundcolor "yellow"
                                               Remove-Item $Folder.FullName -force | out-null
                               }
                }
 }

По сути, это повторение уже проделанной операции. Но тут мы проходимся по всем папкам, ищем пустые папки и удаляем их.

Такой вот не хитрый, но думаю весьма полезный в хозяйстве скриптик. Надеюсь, информация окажется вам полезной.

Автоматическое удаление старых файлов [скрипт PowerShell]. Скрипт в работе

Опубликовано в 11.08.201830.05.2024 от sanglyb

Навигация по записям

← Как сбросить дефолтные объекты групповой политики
Как проверить оперативную память [memtest86] →

10 комментариев для “Автоматическое удаление старых файлов [скрипт PowerShell]”

  1. Zoomizoom:
    04.01.2019 в 14:55

    хорошо бы такой скриптик но

    хорошо бы такой скриптик но со всеми пунктами очистки из CCleaner,ccenhancer,Privazer,remove empty directories и RegOrganizer.вот тогда бы я оплатил его.а то для чего нужно столько программ если все может заменить 1 скрипт?

    Ответить
  2. STALKER_SLX:
    27.01.2019 в 08:10

    Огромная благодарность автору

    Огромная благодарность автору и БОЛЬШОЙ респект за очень полезный в хозяйстве скрипт, а на серверах (особенно терминальных) просто незаменим!

    Ответить
  3. kokos:
    27.05.2020 в 07:35

    Приветствую! Спасибо за

    Приветствую! Спасибо за скрипт. Можно Вас попросить дополнить его записью выполненных действий в текстовый файлик?

    Ответить
    1. sanglyb:
      28.05.2020 в 12:44

      Просто скопируйте все строки

      Просто скопируйте все строки с write-host, замените write-host на write-output и в конец каждой строки добавьте | add-content -path «log.txt
      Например будет как то так:
      write-host «Deleting directory — $Folder» -foregroundcolor «yellow»
      write-output «Deleting directory — $Folder» -foregroundcolor «yellow» | add-content -path «log.txt»
      Либо, возможно будет попроще в самое начало добавить строку
      Start-Transcript -Path .log.txt
      и в самом конце
      stop-transcript
      Но так может не корректно отработать.

      Ответить
  4. Romash:
    25.12.2023 в 08:33

    Здравствуйте.  Какой нужный и

    Здравствуйте.  Какой нужный и прекрасный скрипт.

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

    Ответить
  5. Romash:
    25.12.2023 в 08:40

    Здравствуйте, отличный и

    Здравствуйте, отличный и нужный скрипт!

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

    Ответить
  6. Romash:
    25.12.2023 в 08:49

    Здравствуйте! Спасибо за

    Здравствуйте! 

    Спасибо за скрипт!

    Подскажите пожалуйста, есть папка с названием, внутриэтой папки папки с названием отделов, внутри отделов папки по фамилиям. Задача очищать раз в неделю папки с фамилиями.  Каким образом нужно прописать в скрипте пути к каждой папке? Чтобы скрипт неудалял папки с названиями по фамилиям а только очищал их внутри.

     

    Ответить
  7. Владимир Васильевич Поляков:
    25.11.2024 в 20:27

    … проблема PowerShell не умеет сам правильно переустанавливаться, проблема:
    Работают оба старый 5-й и новый 7-й

    Ответить
  8. кирил:
    05.08.2025 в 14:02

    Запустил скрипт, нужно подтверждать удаление некоторых файлов.
    Скрипт планируется запускаться каждый день, через планировщик заданий. Как допилить его, что б удалялось принудительно

    Ответить
    1. Аноним:
      08.05.2026 в 12:24

      Что-бы не спрашивал, надо добавить
      -Recurse -Force -Confirm:$false

      Ответить

Добавить комментарий Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Подписывайтесь

Youtube
vk
telegram
github
twitter
rss
  • Форум
  • Об авторе
  • Поддержать автора

Популярные записи

Новые записи

  • Как расширить LVM раздел в Linux
  • Исправление ошибки SrsResources.dll после обновления SSRS для SCCM
  • Проблема при использовании библиотеки PassFiltEx на старых процессорах
  • Как удалить вложения из старых событий календаря в Exchange с помощью скрипта
  • Как скачать и установить Office 2024 LTSC

Архивы

  • 2026 (3)
  • 2025 (5)
  • 2024 (7)
  • 2023 (6)
  • 2022 (5)
  • 2021 (25)
  • 2020 (34)
  • 2019 (39)
  • 2018 (78)
  • 2017 (56)
  • 2016 (77)
  • 2015 (9)
© 2015-2026 www.mytechnote.ru
Использование материалов сайта возможно только с разрешения владельца или обязательна индексируемая, прямая, передающая вес ссылка на материал.