Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Удалить файлы из каталога и подкаталогов старше даты Х но младше даты У

Ответить
Настройки темы
Любой язык - [решено] Удалить файлы из каталога и подкаталогов старше даты Х но младше даты У

Пользователь


Сообщения: 105
Благодарности: 1

Профиль | Отправить PM | Цитировать


Здравствуйте!

Есть каталог "Dir".
В этом каталоге - подкаталоги "SubDir1, SubDir2, SubDir3...".
В подкаталогах файлы с датой создания начиная с лохматых времен, которые удалять пока нельзя, но и копировать - некуда.
В подкаталогах файлы создаются каждый день.
Как удалить файлы созданные позже 30.05.21, но раньше 04.05.21?

Помогите, пожалуйста.

Любой язык, WSH. CMD, Powershell

Спасибо!

Отправлено: 15:08, 07-06-2021

 

Аватара для Elven

Ветеран


Сообщения: 992
Благодарности: 268

Профиль | Сайт | Отправить PM | Цитировать


замените 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()

Отправлено: 15:06, 10-06-2021 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


epoddubniy, дата изменения и дата создания необязательно совпадают.

Посмотрите, что у вас пишет
Код: Выделить весь код
dir c:\test -file -recurse |select Name,CreationTime,LastWriteTime
Если вам нужно удалять по дате изменения, то замените в скрипте CreationTime на LastWriteTime.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:47, 10-06-2021 | #22


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Если:
- лохматые времена - это 2000 год и позже
- дата в системе отображается как дд.мм.гг или дд.мм.гггг
- и я правильно понимаю, что надо удалить файлы с 04.05.21<=дата изменения<=30.05.21
то:
Вот CMD
Код: Выделить весь код
@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
если надо удалить файлы вне диапазона с 04.05.21<=дата изменения<=30.05.21
Код: Выделить весь код
: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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 10-06-2021 в 16:15.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:07, 10-06-2021 | #23


Пользователь


Сообщения: 105
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
Посмотрите, что у вас пишет »
DJ Mogarych, пишет вот это

Цитата megaloman:
- дата в системе отображается как дд.мм.гг или дд.мм.гггг
- и я правильно понимаю, что надо удалить файлы с 04.05.21<=дата изменения<=30.05.21 »
дата отображается, как дд.мм.гггг
надо удалить файлы созданные в промежуток с 30.05.2021 по 04.06.2021 (первое условие)
надо удалить файлы созданные 2,3,4,5 дней назад, то есть при запуске скрипта в субботу удаляются файлы созданные в ЧТ,СР,ВТ,ПН (второе условие)
megaloman, скажите пожалуйста, как изменить Ваш код, чтобы он отработал по второму условию, то есть, при запуске скрипта в субботу удаляются файлы созданные в ЧТ,СР,ВТ,ПН

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

Отправлено: 09:54, 11-06-2021 | #24


Аватара для Elven

Ветеран


Сообщения: 992
Благодарности: 268

Профиль | Сайт | Отправить PM | Цитировать


тогда жду результатов выполнения вотэтоговот:
Код: Выделить весь код
$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

Последний раз редактировалось Elven, 11-06-2021 в 10:40.


Отправлено: 10:32, 11-06-2021 | #25


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Цитата epoddubniy:
надо удалить файлы созданные 2,3,4,5 дней назад »
Увы, задача сводится к определению диапазона дат, а в CMD с этим туго.
Вот громоздкий 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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:55, 11-06-2021 | #26


Пользователь


Сообщения: 105
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата Elven:
тогда жду результатов выполнения вотэтоговот: »
Код: Выделить весь код
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
Цитата megaloman:
Увы, задача сводится к определению диапазона дат, а в 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
подставлялись значения переменных, а не ручной ввод?

Отправлено: 09:17, 16-06-2021 | #27


Аватара для Elven

Ветеран


Сообщения: 992
Благодарности: 268

Профиль | Сайт | Отправить PM | Цитировать


Цитата epoddubniy:
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) дни?
если
Цитата epoddubniy:
Current time: 16.06.2021 9:13:34 »
то CreationTime проверяется с 15.06.2021 9:13:34 по 11.06.2021 9:13:34
Ну и понятное дело ничего не удаляется, потому что ничего не попадает в выборку.
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:31, 16-06-2021 | #28


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


epoddubniy,
Цитата epoddubniy:
правильно ли я понимаю, что
Call :Period 04.05.21 30.05.21
вот эту процедуру мне придется выполнять в любом случае? »
Цитата epoddubniy:
надо удалить файлы созданные в промежуток с 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 автоматом попадут даты, привязанные к сегодняшней дате.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:48, 16-06-2021 | #29


Пользователь


Сообщения: 105
Благодарности: 1

Профиль | Отправить PM | Цитировать


Всем спасибо!

Отправлено: 21:30, 20-06-2021 | #30



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Удалить файлы из каталога и подкаталогов старше даты Х но младше даты У

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - [решено] Перенести все файлы из каталогов/подкаталогов в субпапку, а пустые папки удалить Alexander_88 Скриптовые языки администрирования Windows 4 24-11-2015 20:07
VBS/WSH/JS - Удаление файлов старше даты, доработка techobsl Скриптовые языки администрирования Windows 0 14-09-2015 10:24
PowerShell - Удаление файлов старше определенной даты volk1234 Скриптовые языки администрирования Windows 15 23-11-2014 14:52
CMD/BAT - удалить файлы по маске из каталога Gablik Скриптовые языки администрирования Windows 15 04-09-2012 16:23
CMD/BAT - файлы вида mmdd*.* - для каждой даты нужно создать каталог, скопировать, файлы milito Скриптовые языки администрирования Windows 2 24-05-2009 23:32




 
Переход