#powershell
#powershell
Вопрос:
Приведенная ниже команда удаляет файлы старше 30 дней
Get-ChildItem –Path "C:pathtofolder" -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-30))} | Remove-Item
Но как добавить фильтры, которые не удаляют файлы, если
date is 1st of each month or
date is 15th of each month or
date is 30
also ignore files with name '%weekly%'
Ответ №1:
Поскольку требуется только удалять файлы, следует использовать -File
переключатель на Get-ChildItem
. Чтобы не продолжать вычислять исходную дату 30 дней назад, я хотел бы сначала определить ее в переменной $refDate
. Кроме того, вы должны использовать дату, начиная с полуночи, установив для временной части значение 00:00:00
. Вот где Date
появляется свойство.
$refDate = (Get-Date).AddDays(-30).Date # set it to midnight
Get-ChildItem -Path "C:pathtofolder" -File -Recurse |
Where-Object { ($_.LastWriteTime -lt $refDate) -and
($_.BaseName -notlike '*%weekly%*') -and
(1,15,30 -notcontains $_.LastWriteTime.Day)} |
Remove-Item -WhatIf
PS Я добавил -WhatIf
переключатель, чтобы вы могли видеть, что произойдет в первую очередь. Если вы удовлетворены сообщениями в консоли, снимите этот переключатель, чтобы фактически начать удаление файлов
Ответ №2:
Вы можете использовать сценарий powershell, как показано ниже:
$FolderName = "c:devtest"
foreach($file in (GEt-childitem -Path $FolderName -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-30))} ))
{
if (($file.lastwritetime.Date.Day -in 1,15,30 ) -or ($file -like '*weekly*'))
{
continue
}
Remove-Item -Path $file.FullName
}