Вы здесь

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


Автоматическое удаление старых файлов [скрипт 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]. Скрипт в работе

6 0

Поделитесь статьей с друзьями в соц. сетях, возможно, она будет им полезна.


Если вам помогла статья, вы можете >>отблагодарить автора<<


Комментарии

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

0 2

Просто скопируйте все строки с 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
Но так может не корректно отработать.

0 0