• Администрация SafeZone приветствует вас на нашем форуме!
    Если вы больше не желаете видеть рекламу при просмотре тем и сообщений - то достаточно просто зарегистрироваться. Для зарегистрированных пользователей реклама не отображается.

Удаление папок формата 2016.08.01 - 2016.08.16

Станислав

Новый пользователь
Сообщения
14
Симпатии
5
#1
Помогите создать батник удаляющий папки формата 2016.08.01 - 2016.08.16 старше двух недель
 

Кирилл

Команда форума
Администратор
Сообщения
13,028
Симпатии
5,639
#3
У вас проблемы с написанием в плане не знаете как это делается вообще или на чем то конкретно запнулись?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,420
Симпатии
5,277
#5
CMD/BATCH:
forfiles /d -14 | findstr /RC:"^.....\...\... - ....\...\...." | set/p x=^& if Defined x call echo rd /s /q %%x%%
Совместимость: Windows Vista и новее.
После тестирования удалить echo
 
Последнее редактирование:

Станислав

Новый пользователь
Сообщения
14
Симпатии
5
#6
"^.....\...\... - ....\...\...." Уважаемый! а что это. Пусть у меня будет путь I:\MY_SETTINGS

CMD/BATCH:
@echo off
set main_dir="I:\My Flash 32 system\WPI\Install\DEL\oldpass"
call :FromNow -3
for /f "delims=" %%i in ('dir "%main_dir%" /b /ad') do call :p "%%i"
exit

:p
setLocal
set dir_date=%~1
set dir_date=%dir_date:~-10%
if %dir_date:~-4% lss %ddmmyyyy:~-4% goto delete
if %dir_date:~-4% gtr %ddmmyyyy:~-4% goto no_delete
if %dir_date:~3,2% lss %ddmmyyyy:~3,2% goto delete
if %dir_date:~3,2% gtr %ddmmyyyy:~3,2% goto no_delete
if %dir_date:~,2% lss %ddmmyyyy:~,2% goto delete
goto no_delete
:delete
rd /s /q "%main_dir%\%~1"
:no_delete
EndLocal
exit /b

:FromNow
setLocal
set now=%date%
set /a yyyy=%now:~-4%
set /a mm=1%now:~3,2%-100
set /a dd=1%now:~,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 yyyymmdd=%yyyy%.%mm:~-2%.%dd:~-2%
exit /b
скажите а вот из этого можно создать? но папки типа 2016.08.01

созданы батником -
Код:
set X=%DATE%
set M=%X:~3,2%
set Y=%X:~6,4%
for /L %%I IN (1,1,31) do (
IF %%I LSS 10 (%Y%.%M%.0%%I) else (mkdir %Y%.%M%.%%I)
)
рожица это : P только вместе
 
Последнее редактирование модератором:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,420
Симпатии
5,277
#7
Уважаемый! а что это. Пусть у меня будет путь I:\MY_SETTINGS
В моем батнике путь не указывается. Батник необходимо запускать из той же папки, в которой находятся папки формата 2016.08.01 - 2016.08.16.
^.....\...\... - ....\...\.... - регулярное выражение для отсечения формата, о котором Вы просили.
Если нужно и папку указывать, скажите, я добавлю такую функцию.

Код оформляется так.
 

Станислав

Новый пользователь
Сообщения
14
Симпатии
5
#8
CMD/BATCH:
C:\Windows\forfiles /d -14
| findstr /RC:"^.....\...\... - ....\...\...." |
set/p x=^& if Defined x
call rd /s /q %%x%%
pause
пробовал не работает
 
Последнее редактирование модератором:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,420
Симпатии
5,277
#9
Подождите, что вы имеете в виду, когда говорили "старше 2 недель" по первой части названия папки, а не по ее дате изменения?
Мой батник вычисляет по дате модификации.

скажите а вот из этого можно создать?
Из этого нет, но можно по похожему принципу, но там как минимум 2 минуса:
1. Нет фильтрации по формату, как Вы просили, следовательно если там будет что-то кроме папок указанного формата, то код вполне вероятно "вылетит".
2. Код будет зависеть от настроек регионального стандарта даты, установленных в системе, хотя судя по последнему коду он тоже зависим от стандарта, и если он работает правильно то так же правильно будет работать и код выше.

Добавил фильтрацию и заменил функцию получения даты. Этот батник работает по принципу чтения даты из названия папки (первая часть даты).

CMD/BATCH:
@echo off
SetLocal EnableExtensions

set daysAgo=14
set "main_dir=I:\My Flash 32 system\WPI\Install\DEL\oldpass"

call :indate %date% -%daysAgo% TwoWeeksDate

for /f "delims=" %%i in ('dir "%main_dir%" /b /ad^| findstr /RC:"^....\...\... - ....\...\...$"') do call :p "%%i"
pause
exit /B

:p
set file=%~1
call :indate %file:~8,2%.%file:~5,2%.%file:~,4% -0 FileTime
if %FileTime% LEQ %TwoWeeksDate% echo rd /S /Q "%main_dir%\%file%"
exit /b

:InDate
set dat=%~1
Set yyyy=%DAT:~-4%& set /a mm=100%DAT:~3,2%%%100& set /a dd=100%DAT:~,2%%%100
set /A %~3=%~2+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
exit /B
После проверки удалить echo.
CMD/BATCH:
C:\Windows\forfiles /d -14
| findstr /RC:"^.....\...\... - ....\...\...." |
set/p x=^& if Defined x
call rd /s /q %%x%%
pause
пробовал не работает
Это делается не так. Создается батник. В него копируется эта строка. Батник помещается в папку с вашими папками, которые нужно удалить, затем батник нужно запустить.
Чтобы батник сразу не закрывался можно второй строкой написать команду pause.
 
Последнее редактирование модератором:

Станислав

Новый пользователь
Сообщения
14
Симпатии
5
#10
Код:
set X=%DATE%
set M=%X:~3,2%
set Y=%X:~6,4%
for /L %%I IN (1,1,31) do (
IF %%I LSS 10 (mkdir %Y%.%M%.0%%I) else (mkdir %Y%.%M%.%%I)
)
так правильно
да эти условия правильные но батник не работает
pause из Вашего кода убрал но где то косяк
 
Последнее редактирование модератором:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,420
Симпатии
5,277
#11
Станислав, код, пожалуйста, заключайте в теги [code]Ваш код[/code] или есть кнопочка такая (я выше ссылку на тему давал, где всё расписано).

да эти условия правильные но батник не работает
Какой из двух моих?
Я оба проверял и оба у меня работают правильно.
Какая у Вас версия ОС?
Прикрепите батник, который вы проверяете (в виде архива).
Напишите здесь ответ от консоли.
А путь к папке правильно указали?
 
Последнее редактирование:

Станислав

Новый пользователь
Сообщения
14
Симпатии
5
#12
а мой не работает и Золотой человек можно сделать чтобы файл (код этого батника перепишется в другой батник) запускался не из папки I:\My Flash 32 system\WPI\Install\DEL\oldpass
здесь лишь лежат все мои папки с архивами и резервными файлами.
Да понял теперь только через теги буду писать. Спасибо.
 

Вложения

  • 552 байт Просмотры: 2

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,420
Симпатии
5,277
#13
Скорее всего не работает потому что попадает в бесконечный рекурсивный вызов.
Нельзя называть батники именами внутренних команд, таких как echo

можно сделать чтобы файл (код этого батника перепишется в другой батник) запускался не из папки I:\My Flash 32 system\WPI\Install\DEL\oldpass
Достаточно добавить пару команд pushd / popd:
CMD/BATCH:
pushd "I:\My Flash 32 system\WPI\Install\DEL\oldpass"
forfiles /d -14 | findstr /RC:"^.....\...\... - ....\...\...." | set/p x=^& if Defined x call echo rd /s /q %%x%%
popd
pause
Команду echo затем удалите самостоятельно.
 
Последнее редактирование модератором:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,420
Симпатии
5,277
#15
Ладно, давайте по-другому.
Скачайте этот архив, распакуйте, запустите файл RemoveOld.cmd
В результате должна будет удалиться одна из папок (в архиве их 2).

 

Вложения

Станислав

Новый пользователь
Сообщения
14
Симпатии
5
#16
Код:
pushd "C:\reserv"
C:\Windows\forfiles /d -14 | findstr /RC:"^..... - ...." | set/p x=^& if Defined x call rd /s /q %%x%%
popd
10
Да Ваш командный файл рабочий и теперь я понимаю что неправильно сформулировал просьбу. Практически всем пользователям нужно сохранять свою работу и желательно по дням чтобы можно было окатится если случилась неприятность. И в этой теме вы создали или создадите файл удалени я и вот та просьба которую я не смог сформулировать - 2016-08-21_180730.jpg папки расположены так как на рисунке, по этому у меня ничего не работало.
Зашибись из откатится получилось окотится - вот и посмеялись
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,420
Симпатии
5,277
#17
Я сам должен был догадаться.

Теперь всё заработало?
 

Станислав

Новый пользователь
Сообщения
14
Симпатии
5
#18
Вот батник к которому нужна Ваша помощь по удалению устаревших файлов. Простите за мое неграмотную формулировку просьбы.
 

Вложения

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,420
Симпатии
5,277
#19
pushd "C:\reserv"
C:\Windows\forfiles /d -14 | findstr /RC:"^..... - ...." | set/p x=^& if Defined x call rd /s /q %%x%%
popd
Нет, этот не будет работать так, как Вы хотели бы. Эта версия проверяет по дате модификации.
Используйте вариант из этого поста, только замените регулярное выражение (Вы правильно его изменили).
 
Последнее редактирование:

Станислав

Новый пользователь
Сообщения
14
Симпатии
5
#20
Нет пожалуйста!!! Мне нужно ежедневно запускать Ваш файл и он будет удалять папки как у меня!! ( а не 2016.08.01-2016.08.14) т.е. иногда бывают пропуски (выходны, заболел) и устаревающие папки нужно удалять.
Простите, но можно удалять по дате числа и месяца .... .08.01 вот наверное правильная формулировка.