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

Тема в разделе "Пакетные файлы CMD, BAT", создана пользователем Станислав, 16 авг 2016.

  1. Станислав
    Оффлайн

    Станислав Новый пользователь

    Сообщения:
    14
    Симпатии:
    5
    Помогите создать батник удаляющий папки формата 2016.08.01 - 2016.08.16 старше двух недель
     
  2. Guest
    Оффлайн

    Guest Новый пользователь

    Сообщения:
    33
    Симпатии:
    7
  3. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.208
    Симпатии:
    4.977
    У вас проблемы с написанием в плане не знаете как это делается вообще или на чем то конкретно запнулись?
     
  4. Станислав
    Оффлайн

    Станислав Новый пользователь

    Сообщения:
    14
    Симпатии:
    5
  5. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Код (DOS):

    forfiles /d -14 | findstr /RC:"^.....\...\... - ....\...\...." | set/p x=^& if Defined x call echo rd /s /q %%x%%
     
    Совместимость: Windows Vista и новее.
    После тестирования удалить echo
     
    Последнее редактирование: 20 авг 2016
  6. Станислав
    Оффлайн

    Станислав Новый пользователь

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

    Код (DOS):

    @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

    созданы батником -
    Код (Text):

    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)
    )
     
    --- Объединённое сообщение, 20 авг 2016 ---
    рожица это : P только вместе
     
    Последнее редактирование модератором: 21 авг 2016
  7. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    В моем батнике путь не указывается. Батник необходимо запускать из той же папки, в которой находятся папки формата 2016.08.01 - 2016.08.16.
    ^.....\...\... - ....\...\.... - регулярное выражение для отсечения формата, о котором Вы просили.
    Если нужно и папку указывать, скажите, я добавлю такую функцию.

    Код оформляется так.
     
  8. Станислав
    Оффлайн

    Станислав Новый пользователь

    Сообщения:
    14
    Симпатии:
    5
    Код (DOS):
    C:\Windows\forfiles /d -14
    | findstr /RC:"^.....\...\... - ....\...\...." |
    set/p x=^& if Defined x
    call rd /s /q %%x%%
    pause
    пробовал не работает
     
    Последнее редактирование модератором: 21 авг 2016
  9. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Подождите, что вы имеете в виду, когда говорили "старше 2 недель" по первой части названия папки, а не по ее дате изменения?
    Мой батник вычисляет по дате модификации.

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

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

    Код (DOS):

    @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.
    --- Объединённое сообщение, 20 авг 2016 ---
    Это делается не так. Создается батник. В него копируется эта строка. Батник помещается в папку с вашими папками, которые нужно удалить, затем батник нужно запустить.
    Чтобы батник сразу не закрывался можно второй строкой написать команду pause.
     
    Последнее редактирование модератором: 21 авг 2016
  10. Станислав
    Оффлайн

    Станислав Новый пользователь

    Сообщения:
    14
    Симпатии:
    5
    Код (Text):
    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)
    )
     
    так правильно
    --- Объединённое сообщение, 20 авг 2016 ---
    да эти условия правильные но батник не работает
    --- Объединённое сообщение, 20 авг 2016 ---
    pause из Вашего кода убрал но где то косяк
     
    Последнее редактирование модератором: 20 авг 2016
  11. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Станислав, код, пожалуйста, заключайте в теги [code]Ваш код[/code] или есть кнопочка такая (я выше ссылку на тему давал, где всё расписано).

    Какой из двух моих?
    Я оба проверял и оба у меня работают правильно.
    Какая у Вас версия ОС?
    Прикрепите батник, который вы проверяете (в виде архива).
    Напишите здесь ответ от консоли.
    --- Объединённое сообщение, 20 авг 2016 ---
    А путь к папке правильно указали?
     
    Последнее редактирование: 20 авг 2016
  12. Станислав
    Оффлайн

    Станислав Новый пользователь

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

    Вложения:

    • echo.zip
      Размер файла:
      552 байт
      Просмотров:
      2
  13. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Скорее всего не работает потому что попадает в бесконечный рекурсивный вызов.
    Нельзя называть батники именами внутренних команд, таких как echo

    Достаточно добавить пару команд pushd / popd:
    Код (DOS):

    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 затем удалите самостоятельно.
     
    Последнее редактирование модератором: 21 авг 2016
    akok и Kиpилл нравится это.
  14. Станислав
    Оффлайн

    Станислав Новый пользователь

    Сообщения:
    14
    Симпатии:
    5
    Но у меня не работает.
     
  15. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Ладно, давайте по-другому.
    Скачайте этот архив, распакуйте, запустите файл RemoveOld.cmd
    В результате должна будет удалиться одна из папок (в архиве их 2).

     

    Вложения:

    • RemoveOld.zip
      Размер файла:
      1 КБ
      Просмотров:
      1
    Kиpилл нравится это.
  16. Станислав
    Оффлайн

    Станислав Новый пользователь

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

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Я сам должен был догадаться.

    Теперь всё заработало?
     
  18. Станислав
    Оффлайн

    Станислав Новый пользователь

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

    Вложения:

  19. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.477
    Симпатии:
    4.306
    Нет, этот не будет работать так, как Вы хотели бы. Эта версия проверяет по дате модификации.
    --- Объединённое сообщение, 21 авг 2016 ---
    Используйте вариант из этого поста, только замените регулярное выражение (Вы правильно его изменили).
     
    Последнее редактирование: 21 авг 2016
  20. Станислав
    Оффлайн

    Станислав Новый пользователь

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

Поделиться этой страницей