Войти

Показать полную графическую версию : [решено] Удалить файлы из каталога и подкаталогов старше даты Х но младше даты У


Страниц : 1 [2]

Elven
10-06-2021, 15:06
замените del на write-host чтобы увидеть, что он таки находит нужные файлы.
вот этот вариант отрабатывает на раз, если есть файлы попадающие под фильтр.
$t = Get-Date
(Get-ChildItem -File -Recurse | Where-Object {$_.CreationTime -lt $t.Date.AddDays(-1) -and $_.CreationTime -ge $t.Date.AddDays(-4)}).Delete()

DJ Mogarych
10-06-2021, 15:47
epoddubniy, дата изменения и дата создания необязательно совпадают.

Посмотрите, что у вас пишет

dir c:\test -file -recurse |select Name,CreationTime,LastWriteTime


Если вам нужно удалять по дате изменения, то замените в скрипте CreationTime на LastWriteTime.

megaloman
10-06-2021, 16:07
Если:
- лохматые времена - это 2000 год и позже
- дата в системе отображается как дд.мм.гг или дд.мм.гггг
- и я правильно понимаю, что надо удалить файлы с 04.05.21<=дата изменения<=30.05.21
то:@Echo Off
Set "BoxIn=Z:\Box_Arc"
Set "Date1=04.05.21"
Set "Date2=30.05.21"

Set "D1=20%Date1:~-2%%Date1:~3,2%%Date1:~0,2%"
Set "D2=20%Date2:~-2%%Date2:~3,2%%Date2:~0,2%"

For /f "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D /O:D /S "%BoxIn%\*.*"`) Do (
Set "DD=%%~tf"
Call :MyDel "%%f" %D1% %D2% %%DD%%
)
Exit /B

:MyDel
Set "DD=%4"
Set "DD=20%DD:~-2%%DD:~3,2%%DD:~0,2%"
If %2 LEQ %DD% If %DD% LEQ %3 Del %1
Exit /BИдея решения: даты прекрасно можно сравнивать, если дату сконвертировать в число вида ггггммдд, тогда в этом случае не нужно инвертировать даты в т.н. julian day:MyDel
Set "DD=%4"
Set "DD=20%DD:~-2%%DD:~3,2%%DD:~0,2%"
If %2 LEQ %DD% If %DD% LEQ %3 Exit /B
Del %1
Exit /B

epoddubniy
11-06-2021, 09:54
Посмотрите, что у вас пишет »
DJ Mogarych, пишет вот это
https://wmpics.pics/di-IF7I.png
- дата в системе отображается как дд.мм.гг или дд.мм.гггг
- и я правильно понимаю, что надо удалить файлы с 04.05.21<=дата изменения<=30.05.21 »
дата отображается, как дд.мм.гггг
надо удалить файлы созданные в промежуток с 30.05.2021 по 04.06.2021 (первое условие)
надо удалить файлы созданные 2,3,4,5 дней назад, то есть при запуске скрипта в субботу удаляются файлы созданные в ЧТ,СР,ВТ,ПН (второе условие)
megaloman, скажите пожалуйста, как изменить Ваш код, чтобы он отработал по второму условию, то есть, при запуске скрипта в субботу удаляются файлы созданные в ЧТ,СР,ВТ,ПН

Код:
$t = Get-Date
(Get-ChildItem -File -Recurse | Where-Object {$_.CreationTime -lt $t.Date.AddDays(-1) -and $_.Creation »
перешел в каталог, выполнил код, файлы к сожалению не удалились

Elven
11-06-2021, 10:32
тогда жду результатов выполнения вотэтоговот:
$t = Get-Date
$rl = Get-ChildItem -File -Recurse | Where-Object {$_.CreationTime -lt $t.Date.AddDays(-1) -and $_.CreationTime -ge $t.Date.AddDays(-4)}
if ($null -ne $rl) {
Write-Host CreationTime in removing list:
$rl | Select-Object CreationTime
# $rl.Delete()
} else {
Write-Host Current time: $t
Get-ChildItem -File -Recurse | Select-Object CreationTime
}
Скриншоты сувать не обязательно, можно просто вывод обрамленный тегом code

megaloman
11-06-2021, 10:55
надо удалить файлы созданные 2,3,4,5 дней назад »Увы, задача сводится к определению диапазона дат, а в CMD с этим туго. @Echo Off
Set "BoxIn=Z:\Box_Arc"
Call :Period 04.05.21 30.05.21

Call :FromDate -5 %Date% "Date1"
Call :FromDate -2 %Date% "Date2"
Call :Period %Date1% %Date2%
Exit /B

:Period
Set "Date1=%1"
Set "Date2=%2"

Set "D1=20%Date1:~-2%%Date1:~3,2%%Date1:~0,2%"
Set "D2=20%Date2:~-2%%Date2:~3,2%%Date2:~0,2%"

For /f "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D /O:D /S "%BoxIn%\*.*"`) Do (
Set "DD=%%~tf"
Call :MyDel "%%f" %D1% %D2% %%DD%%
)
Exit /B

:MyDel
Set "DD=%4"
Set "DD=20%DD:~-2%%DD:~3,2%%DD:~0,2%"
If %2 LEQ %DD% If %DD% LEQ %3 Del %1
Exit /B

:FromDate

rem Пересчет даты на заданное кол-во дней
rem В первом аргументе +- дни
rem Во втором аргументе дата в формате dd.mm.yyyy
rem В третем аргументе имя переменной в кавычках где получим новую дату в формате dd.mm.yyyy

rem Заимствовано http://forum.oszone.net/thread-186889.html
rem вызов Call :FromNow %DeltaDay% %Date% "MyDate"
rem результат в перемменной %MyDate%

SetLocal
Set "DT=%~2"
Set yyyy=%DT:~-4%& set /a mm=100%DT:~3,2%%%100& set /a dd=100%DT:~,2%%%100
Set /A JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
Set /A L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
Set /A L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
Set /A J=J+2-12*L,I=100*(N-49)+I+L
Set /A yyyy=I,mm=100+J,dd=100+K
EndLocal& Set "%~3=%dd:~-2%.%mm:~-2%.%yyyy%"
GoTo :Eof

epoddubniy
16-06-2021, 09:17
тогда жду результатов выполнения вотэтоговот: »
PS C:\Users\Кубрин\Desktop> cd C:\test

PS C:\test> $t = Get-Date

PS C:\test> $rl = Get-ChildItem -File -Recurse | Where-Object {$_.CreationTime -lt $t.Date.AddDays(-1) -and $_.CreationTime -ge $t.Date.AddDays(-4)}


PS C:\test> if ($null -ne $rl) {
Write-Host CreationTime in removing list:
$rl | Select-Object CreationTime
# $rl.Delete()
} else {
Write-Host Current time: $t
Get-ChildItem -File -Recurse | Select-Object CreationTime
}
Current time: 16.06.2021 9:13:34

CreationTime
------------
29.05.2021 14:19:49
02.06.2021 14:19:05
03.06.2021 14:18:46
28.05.2021 14:20:02
06.06.2021 14:18:03
05.06.2021 14:17:47
01.06.2021 14:19:25
04.06.2021 14:17:30
27.05.2021 14:20:11



Увы, задача сводится к определению диапазона дат, а в CMD с этим туго. »
megaloman, правильно ли я понимаю, что Call :Period 04.05.21 30.05.21 вот эту процедуру мне придется выполнять в любом случае?
Тогда - вопрос, могу ли я заменить 30.05.21 на переменную %date%?
И еще вопрос, можно ли каким-либо образом заранее объявить переменную, например, PeriodDateNachalo, значение которой бы определялось %date% минус 5 дней, чтобы в выражение Call :Period 04.05.21 30.05.21 подставлялись значения переменных, а не ручной ввод?

Elven
16-06-2021, 09:31
29.05.2021 14:19:49
02.06.2021 14:19:05
03.06.2021 14:18:46
28.05.2021 14:20:02
06.06.2021 14:18:03
05.06.2021 14:17:47
01.06.2021 14:19:25
04.06.2021 14:17:30
27.05.2021 14:20:11 »
epoddubniy, ну и где тут файлы созданные с (-1) по (-4) дни?
если Current time: 16.06.2021 9:13:34 »
то CreationTime проверяется с 15.06.2021 9:13:34 по 11.06.2021 9:13:34
Ну и понятное дело ничего не удаляется, потому что ничего не попадает в выборку.

megaloman
16-06-2021, 12:48
epoddubniy, правильно ли я понимаю, что
Call :Period 04.05.21 30.05.21
вот эту процедуру мне придется выполнять в любом случае? » надо удалить файлы созданные в промежуток с 30.05.2021 по 04.06.2021 (первое условие)
надо удалить файлы созданные 2,3,4,5 дней назад, то есть при запуске скрипта в субботу удаляются файлы созданные в ЧТ,СР,ВТ,ПН (второе условие) »
- понятия не имею, Вы поставили 2 условия и они реализованы. Если у Вас период привязан к сегодняшней дате и Вы можете сформулировать, каким образом, то период вручную вводить не надо.

Call :Period 04.05.21 30.05.21

Call :FromDate -5 %Date% "Date1"
Call :FromDate -2 %Date% "Date2"

echo Date =%Date%
echo Date1=%Date1%
echo Date2=%Date2%

Call :Period %Date1% %Date2%
Call :FromDate -5 %Date% "Date1"
в переменной %Date1% выдаётся дата, отстоящая от %Date% на -5 дней
Call :FromDate -2 %Date% "Date2"
в переменной %Date2% выдаётся дата, отстоящая от %Date% на -2 дней
Если сегодня 16.06.2021, то отладочные Echo выдадут
Date =16.06.2021
Date1=11.06.2021
Date2=14.06.2021
Соответственно, в процедуру Call :Period автоматом попадут даты, привязанные к сегодняшней дате.

epoddubniy
20-06-2021, 21:30
Всем спасибо!




© OSzone.net 2001-2012