Войти

Показать полную графическую версию : [решено] Копирование папок с текущей датой +1 день в названии (кроме выходных)


Сантей
25-02-2015, 17:12
Помогите, не могу разобраться, я работаю на телевидении, мне надо чтобы каждый день создавалась папка на завтра, с пропуском выходных дней, но не просто создавалась, а копировалось всё из сегодняшней, так сказать:
copy %день%_%месяц%_News %день+1%_%месяц%_News


Таков формат названия папки, в ней тоже есть папки и файлы формата %день%_%месяц%_Фамилия.
Надо чтоб они тоже переименовывались в %день+1%_%месяц%_Фамилия

Опиум
26-02-2015, 16:34
пропуском выходных дней »
как вы себе это представляете?)
я в свое время специальный календарь писал типа планинга, чтобы шедулеры разные не жестко к дням недели привязывались,а к тому что я задам, Ибо праздников в стране дофига.

Vadikan
26-02-2015, 17:53
Пропуск выходных дней (СБ и ВС) легко организует планировщик (о праздничных он не знает, конечно).
http://i.imgur.com/Bk0YH9Q.png

Сантей
02-03-2015, 13:09
как вы себе это представляете?)
я в свое время специальный календарь писал типа планинга, чтобы шедулеры разные не жестко к дням недели привязывались,а к тому что я задам, Ибо праздников в стране дофига. »
с праздниками хрен с ними, главное выходные дни пропускать. Вот слепил пока копирование, осталось переименование:
@echo off
SetLocal EnableExtensions

:: Добавление к дате +1, +3 дня
call :fromDate "%date%" +0 ddmmyyyy1 wd1
call :fromDate "%date%" +1 ddmmyyyy2 wd2
call :fromDate "%date%" +3 ddmmyyyy3 wd3

:: Проверка на день недели и копирование папки
if "%wd1%" neq "5" if exist "%ddmmyyyy1:~-2,2%_%ddmmyyyy1:~-5,2%_News" xcopy /s /e /q /i "%ddmmyyyy1:~-2,2%_%ddmmyyyy1:~-5,2%_News" "%ddmmyyyy2:~-2,2%_%ddmmyyyy2:~-5,2%_News"
if "%wd1%"=="5" if exist "%ddmmyyyy1:~-2,2%_%ddmmyyyy1:~-5,2%_News" xcopy /s /e /q /i "%ddmmyyyy1:~-2,2%_%ddmmyyyy1:~-5,2%_News" "%ddmmyyyy3:~-2,2%_%ddmmyyyy3:~-5,2%_News"



pause>nul & goto :eof


:FromDate [Дата] [действие (+-) Число дней] [Переменная для хранения результата]
:: Функция работы с датами
setLocal
set "now=%~1"
set /a yyyy=%now:~-4%
set /a mm=1%now:~3,2%-100
set /a dd=1%now:~,2%-100
set /a JD=%~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
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, DW=(JD+1)%%7
EndLocal& set "%~3=%yyyy%.%mm:~-2%.%dd:~-2%" & if %DW%==0 (set "%~4=7") else (set "%~4=%DW%")
exit /b

Georgio
02-03-2015, 21:37
Сантей, а не проще ли использовать такой код:


@echo off

for /f "tokens=1,2,4,5 delims=.-/" %%i in ('
mshta vbscript:Execute("Set x=CreateObject(""Scripting.FileSystemObject"").GetStandardStream(1):If Weekday(Now,vbMonday)<>5 Then:x.Write(Date&""-""&DateAdd(""D"",1,Date)):Else x.Write(Date&"".""&DateAdd(""D"",3,Date)):End If:Close()"^)
') do (
for /f %%m in ('dir/a/b %%i_%%j_News') do (
for /f "tokens=1,2* delims=_" %%n in ("%%~nxm") do (
if "%%n_%%o" equ "%%i_%%j" (
echo f| xcopy/i/h/k/y "%%i_%%j_News\%%m" "%%k_%%l_News\%%k_%%l_%%p">nul
) else (
echo f| xcopy/i/h/k/y "%%i_%%j_News\%%m" "%%k_%%l_News\%%m">nul
)
)
)
)

exit/b


?



Таков формат названия папки, в ней тоже есть папки и файлы формата %день%_%месяц%_Фамилия.
Надо чтоб они тоже переименовывались в %день+1%_%месяц%_Фамилия »


Данный код это также делает.

Сантей
03-03-2015, 13:06
а не проще ли использовать такой код: » я в том-то несколько дней разбирался, а в этом еще неделю придется :) Спасибо, он работает, но я не до конца объяснил (моя вина), структура чуть глубже выглядит:

%день%_%месяц%_News
-%день%_%месяц%_Фамилия----->%день%_%месяц%_Фамилия.file
-%день%_%месяц%_Фамилия----->%день%_%месяц%_Фамилия.file
-%день%_%месяц%_Фамилия.file

Переименовывает только содержимое папки %день%_%месяц%_News.
Еще куда можно путь к папке подставить, чтоб не хранить cmd рядом?

Georgio
03-03-2015, 13:48
Спасибо, он работает, но я не до конца объяснил (моя вина), структура чуть глубже выглядит »



Сантей, тогда всё ещё проще (так как уже не нужно бояться, что код переименует что-то лишнее:)):


@echo off

for /f "tokens=1,2,4,5 delims=.-/" %%i in ('
mshta vbscript:Execute("Set x=CreateObject(""Scripting.FileSystemObject"").GetStandardStream(1):If Weekday(Now,vbMonday)<>5 Then:x.Write(Date&""-""&DateAdd(""D"",1,Date)):Else x.Write(Date&"".""&DateAdd(""D"",3,Date)):End If:Close()"^)
') do (
for /f %%m in ('dir/a-d/b/s %%i_%%j_News') do (
set x=%%m
echo f|>nul cmd/v/c xcopy/h/k/y "%%m" "!x:\%%i_%%j_=\%%k_%%l_!"
)
)

exit/b


.

Сантей
03-03-2015, 16:19
Georgio, а как лучше добавить проверку на существование завтрашней папки? вдруг комп перезагружаться будет, а скрипт в автозагрузке

Georgio
03-03-2015, 23:26
а как лучше добавить проверку на существование завтрашней папки? вдруг комп перезагружаться будет, а скрипт в автозагрузке »


@echo off

for /f "tokens=1,2,4,5 delims=.-/" %%i in ('
mshta vbscript:Execute("Set x=CreateObject(""Scripting.FileSystemObject"").GetStandardStream(1):If Weekday(Now,vbMonday)<>5 Then:x.Write(Date&""-""&DateAdd(""D"",1,Date)):Else x.Write(Date&"".""&DateAdd(""D"",3,Date)):End If:Close()"^)
') do (
for /f %%m in ('if not exist "%%k_%%l_News" dir/a-d/b/s "%%i_%%j_News"') do (
set x=%%m
echo f|>nul cmd/v/c xcopy/h/k/y "%%m" "!x:\%%i_%%j_=\%%k_%%l_!"
)
)

exit/b



куда можно путь к папке подставить, чтоб не хранить cmd рядом? »


@echo off

:: Директория, в которой находятся папки "*_*_News":
set "dir=C:\Test"

for /f "tokens=1,2,4,5 delims=.-/" %%i in ('
mshta vbscript:Execute("Set x=CreateObject(""Scripting.FileSystemObject"").GetStandardStream(1):If Weekday(Now,vbMonday)<>5 Then:x.Write(Date&""-""&DateAdd(""D"",1,Date)):Else x.Write(Date&"".""&DateAdd(""D"",3,Date)):End If:Close()"^)
') do (
for /f %%m in ('if not exist "%dir%\%%k_%%l_News" dir/a-d/b/s "%dir%\%%i_%%j_News"') do (
set x=%%m
echo f|>nul cmd/v/c xcopy/h/k/y "%%m" "!x:\%%i_%%j_=\%%k_%%l_!"
)
)

exit/b




© OSzone.net 2001-2012