Хочу сегодня показать вам очередной скрипт 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]. Скрипт в работе](https://www.mytechnote.ru/wp-content/uploads/2018/08/1-script1.jpg)
хорошо бы такой скриптик но
хорошо бы такой скриптик но со всеми пунктами очистки из CCleaner,ccenhancer,Privazer,remove empty directories и RegOrganizer.вот тогда бы я оплатил его.а то для чего нужно столько программ если все может заменить 1 скрипт?
Огромная благодарность автору
Огромная благодарность автору и БОЛЬШОЙ респект за очень полезный в хозяйстве скрипт, а на серверах (особенно терминальных) просто незаменим!
Приветствую! Спасибо за
Приветствую! Спасибо за скрипт. Можно Вас попросить дополнить его записью выполненных действий в текстовый файлик?
Просто скопируйте все строки
Просто скопируйте все строки с 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
Но так может не корректно отработать.
Здравствуйте. Какой нужный и
Здравствуйте. Какой нужный и прекрасный скрипт.
Подскажите пожалуйста, а если у меня одна папка с названием а внутри папки с названием отделов и в них по фамилиям лежат папки. Вот мне раз в неделю нужно очищать внутри папок с названиями фамилий. Мне в скрипте,путь нужно прописывать к каждой папке с фамилими отдельно получается?
Здравствуйте, отличный и
Здравствуйте, отличный и нужный скрипт!
У меня папка с названием, внутри лежат папки по отделам а в отделах папки по фамилии. Как нужно прописать в скрипте чтобы раз в неделю папки которые по фамилии очищались.
Здравствуйте! Спасибо за
Здравствуйте!
Спасибо за скрипт!
Подскажите пожалуйста, есть папка с названием, внутриэтой папки папки с названием отделов, внутри отделов папки по фамилиям. Задача очищать раз в неделю папки с фамилиями. Каким образом нужно прописать в скрипте пути к каждой папке? Чтобы скрипт неудалял папки с названиями по фамилиям а только очищал их внутри.
… проблема PowerShell не умеет сам правильно переустанавливаться, проблема:
Работают оба старый 5-й и новый 7-й
Запустил скрипт, нужно подтверждать удаление некоторых файлов.
Скрипт планируется запускаться каждый день, через планировщик заданий. Как допилить его, что б удалялось принудительно
Что-бы не спрашивал, надо добавить
-Recurse -Force -Confirm:$false