Цитата Daemonstar:
файлы падают в директорию после обработки, и по свойствам они все 6 как бы за понедельник »
|
ну значит этот трикс не пройдёт... проблема не в делении файлов по 3, а в расчете даты, отличной от текущей, так как в CMD нет своих средств по работе с датами (в отличие от WSH)... но грамотное использование планировщика позволяет часто обойти эту проблему - к примеру, запускать скрипт все рабочие дни + суббота, но в субботу ничего не копировать, а только создавать пустой каталог, который уже заполнять файлами в понедельник...
при "лобовом" методе дату придется вычислять арифметически, примерно так:
читать дальше »
Код:

@echo off
SetLocal EnableDelayedExpansion
set SRC=C:\TEST1
set DST=C:\TEST2
set REG="F[0-9][0-9][0-9][0-9][0-9][0-9][0-9]"
call:StepWorkDays& set $k=3
for /f "delims=" %%a in ('dir/a-d/b/o-n "%SRC%\*"^|FindStr /iberc:%REG%') do (
if !$k! equ 0 call:StepWorkDays -1& set $k=3
if not exist "%DST%\!yyyy!!mm!!dd!\" md "%DST%\!yyyy!!mm!!dd!"
echo copy/y "%SRC%\%%a" "%DST%\!yyyy!!mm!!dd!\">nul
rem.del "%SRC%\%%a"
set/a $k-=1
)
EXIT
:StepWorkDays [%workdays%]
::-------------------------
if "%dd%"=="" set "yyyy=%DATE:~-4%"& set "mm=%DATE:~3,2%"& set "dd=%DATE:~,2%"
SetLocal& set/a "$m=100%mm%%%100,$d=100%dd%%%100,$y=10000%yyyy%%%10000,$i=%~1+0"
set $z=0& if %$i% gtr 0 (set $z=+1) else if %$i% lss 0 set/a "$z-=1,$i=-($i)"
set/a JD=$d-32075+1461*($y+4800+($m-14)/12)/4+367*($m-2-($m-14)/12*12)/12-3*(($y+4900+($m-14)/12)/100)/4
:StepWorkDays_LOOP
set/a DW=%JD%%%7
if %$z% equ 0 if %DW% gtr 5 (Exit/B 1) Else Exit/B 0
if %DW% gtr 5 set/a "JD=JD%$z%"& GoTo:StepWorkDays_LOOP
if %$i% neq 0 set/a "JD=JD%$z%,$i-=1"& GoTo:StepWorkDays_LOOP
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 $m=100+J,$d=100+K,$y=10000+I
EndLocal& set/a "dw=1+(%JD%)%%7,yyyy=%$y:~-4%"& set "mm=%$m:~-2%"& set "dd=%$d:~-2%"
Exit/B 0
процедура
StepWorkDays вычисляет (рабочий) день, отстоящий от текущего на заданное количество (рабочих) дней - вперёд или назад, скрипт настроен на 6-дневную рабочую неделю, для 5-дневки нужно поменять в 2-х местах (выделено цветом) "5" на "4", при запуске без параметров проверяет текущий день (рабочий/выходной), читает/устанавливает переменные окружения DW (день недели), YYYY (год), MM (месяц), DD (день)
P.S. использованы формулы пересчета даты с
www.dostips.com