cmd/bat: работа с папками за определённый промежуток времени.

script

Новый пользователь
Сообщения
7
Реакции
0
Баллы
3
Приветствую,

подскажите, как можно реализовать следующее:
например есть папка c:\main\
в ней ежедневно создаются папки (с вложенными файлами) в наименовании при создании папки, указывается текущий год, месяц, день в формате 2020_01_23
есть готовый bat-файл, который заходит в main\* и по всем папкам со всеми файлами проделывает ряд операций.
каким образом можно сделать, что-бы bat-файл выполнял все операции с файлами, только в тех папках, которые меня интересуют: например все папки за последний месяц ? (по дате создания / изменения вычислять календарный месяц ну или просто например 30 дней)
т.е. чтобы запустив bat-файл он проделывал ряд операций с теми файлами, которые находятся не во всех папках \main\* а только в тех, которые можно указать например через поиск по маске ...
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,378
Реакции
5,877
Баллы
718
Здравствуйте, script!
Добро пожаловать на SafeZone.

Вообще, через
Код:
forfiles /D +01.01.2020
(от начала месяца до текущей даты)

при чём дату придется подставлять самому, т.к. функция /D +дней у нее багнутая: Забавные ошибки в переводе и еще капля юмора от M$ - CMD/BAT - Страница 4 - Киберфорум

но это проверка только по дате модификации, а не дате в названии папки.
Чтобы проверять по названию, нужно считать даты вручную.
На CMD это можно сделать только чистой математикой.

За текущий месяц:
CMD/BATCH:
@echo off
Setlocal Enableextensions

set "folder=c:\main"

set month=%date:~3,2%
set year=%date:~6,4%

::echo year=%year%
::echo month=%month%

for /f "delims=" %%a in ('dir /b /ad "%folder%\%year%_%month%_*"') do call :processing "%folder%\%%a"

pause
goto :eof

:processing

  echo Process: %~1

exit /b
За последние 30 дней:

CMD/BATCH:
@echo off
Setlocal Enableextensions

set "folder=c:\main"
set Fresh=30

For /L %%C in (0, -1, -%Fresh%) do call :FromNow %%C& call set ""%%ret%%"=*"

For /F "delims=" %%a in ('dir /b /ad "%Folder%\*"') do if defined "%%a" echo rd /s /q "%Folder%\%%a"
pause
goto :eof
 
: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 ret=%yyyy%_%mm:~-2%_%dd:~-2%
exit /b

:processing

  echo Process: %~1

exit /b
 

script

Новый пользователь
Сообщения
7
Реакции
0
Баллы
3
За текущий месяц:
CMD/BATCH:
@echo off
Setlocal Enableextensions

set "folder=c:\main"

set month=%date:~3,2%
set year=%date:~6,4%

::echo year=%year%
::echo month=%month%

for /f "delims=" %%a in ('dir /b /ad "%folder%\%year%_%month%_*"') do call :processing "%folder%\%%a"

pause
goto :eof

:processing

echo Process: %~1

exit /b
Приветствую,
да, данный вариант очень хорошо подходит, (все папки выбирает корректно) подскажите, как корректно вставить после этого поиска папок мой скрипт из готового bat-файла - что-бы операция затрагивала не все файлы, или мне нужно наоборот данный пример внести в шаблоны поиска для файлов ?перед выполнением операций ? чет туплю ...) я думал что после
goto :eof :processing
надо было вставить мой код, но нет ...
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,378
Реакции
5,877
Баллы
718

script

Новый пользователь
Сообщения
7
Реакции
0
Баллы
3
да. И в конце exit /b
а в месте, куда подставить файл, указать %~1
Разумеется, других exit не должно быть.
все получилось, просто криво первый раз вставил свой код )
большое спасибо!
 

script

Новый пользователь
Сообщения
7
Реакции
0
Баллы
3
есть темка: по неделям есть варик разбить месяц ? без математики ?
set month=%date:~3,2%/ и как бы sql добавить + date_trunc('week',a."StartTime");
 
Последнее редактирование:

script

Новый пользователь
Сообщения
7
Реакции
0
Баллы
3
где тут ошибка, уже устал разбираться (это для меня новое) в cmd и bat ) подсажите плиз

CMD/BATCH:
@echo off

setlocal enableextensions
chcp 1251 >nul

set "folder=e:\Records\$Запись"
set fresh=7

for /l %%c in (0, -1, -%fresh%) do call :fromnow %%c & call set ""%%ret%%"=*"

for /f "delims=" %%a in ('dir /b /ad "%folder%\*"') do if defined "%%a" echo rd /s /q "%folder%\%%a"
pause
goto :eof
 
: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 ret=%yyyy%_%mm:~-2%_%dd:~-2%

echo Process: %~1

echo.
echo. converting started
for /f %%a in ('dir /b /s /a-d "%%a\*"') do sox %%~a -e gsm-full-rate %%~a+converting.wav
echo. converting finished
echo.
echo. deleting original files
for /f "tokens=1* delims=/" %%a in ('dir /a-D %%a /S /b^|find/i"converting" /v') do del /q "%%a"
echo. deleting finished
echo.
echo. rename files started
for /f %%a in ('dir /b /s /a-d %%a') do (for /f "tokens=1* delims=+." %%b in ("%%~na") do ren "%%~a" "%%~b%%~xa")
echo. rename finished
echo.

exit /b
 

script

Новый пользователь
Сообщения
7
Реакции
0
Баллы
3
в общем, разобравшись во всем (по частям), удалось корректно запустить bat-файл для выполнения условий, изменив вот это:
CMD/BATCH:
EndLocal & set ret=%folder%\%yyyy%_%mm:~-2%_%dd:~-2%
и далее для всех файлов на входе соответственно указать:
CMD/BATCH:
for /f %%a in ('dir /b /s /a-d "%ret%"') do
и все
 
Сверху Снизу