Powershell удаляет файлы папок на основе критериев диапазона дат

#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
}