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