Заметки · 06.06.2022

Зачистка папок профилей

Вопрос рекурсивной очистки папок профилей особенно актуален, когда речь заходит о пользователях на серверах удалённых приложений. Допустим, пользователи пользуются удалённым браузером и скачивают файлы. В какой-то момент, в папке Downloads в профиле каждого пользователя скапливается некое количество мусора, от которого нужно избавиться.

Провести зачистку папки загрузок можно с помощью скрипта PS1:

$pathtodelete = "C:\Users\*\Downloads"
Get-ChildItem -Path $pathtodelete -Recurse | Remove-Item -Recurse

Кстати! Бывает и так, что удалённое приложение создаёт какие-то свои файлы на рабочем столе пользователя (%PROFILE%\Desktop) — затереть файлы можно, сменив целевую папку в переменной $pathtodelete:

$pathtodelete = "C:\Users\*\Desktop"
Get-ChildItem -Path $pathtodelete -Recurse | Remove-Item -Recurse

А что если нужно удалять файлы не все подряд, а ориентироваться по дате создания ($_.CreationTime)? Например, оставлять только те файлы, которые были созданы скачаны за последние 60 дней, а все остальные файлы — в утиль.

Тогда код скрипта будет таким:

## Переменные ##
$pathtodelete = "C:\Users\*\Downloads"
$getdate = (Get-Date).AddDays(-60)

## Удаление по дате создания файла ##
Get-ChildItem $pathtodelete -Recurse | Where-Object { -not $_.PSIsContainer -and $_.CreationTime -lt $getdate } | Remove-Item -Force -Recurse

## Удаление опустевших папок ##
Get-ChildItem -Path $pathtodelete -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse

Примечательно, что опустевшие директории нужно удалять отдельной конструкцией.

Чтобы удалить файлы по дате изменения — нужно заменить атрибут переменной $_ с упомянутого выше CreationTime на LastWriteTime.

Увеличить или уменьшить диапазон можно в переменной $getdate: достаточно заменить 60 на любое другое количество дней.