Хочу сегодня показать вам очередной скрипт 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 } } }
По сути, это повторение уже проделанной операции. Но тут мы проходимся по всем папкам, ищем пустые папки и удаляем их.
Такой вот не хитрый, но думаю весьма полезный в хозяйстве скриптик. Надеюсь, информация окажется вам полезной.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Поделитесь статьей с друзьями в соц. сетях, возможно, она будет им полезна.
Если вам помогла статья, вы можете >>отблагодарить автора<<
Комментарии
хорошо бы такой скриптик но со всеми пунктами очистки из 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
Но так может не корректно отработать.