Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Скопировать файл и дать ему имя завтрашней даты (http://forum.oszone.net/showthread.php?t=346004)

Heavenanvil 31-07-2020 05:35 2929739

Скопировать файл и дать ему имя завтрашней даты
 
Всем привет. Стоит такая задача.
В папке лежат куча txt-файлов с именами в формате даты YYYY-MM-DD (например 2020-07-31.txt).
Нужно написать bat-скриптик, который должен будет делать следующее:
1. Определяем текущую дату.
2. Проверяем существует ли файл с текущей датой (например 2020-07-31.txt).
• Если файл с текущей датой не существует, то ничего не делаем, закрываем программу.
• Если файл с текущей датой существует, то продолжаем.
3. Проверяем существует ли файл с завтрашней датой (например 2020-08-01.txt).
• Если файл с завтрашней датой уже существует, то ничего не делаем.
• Если файл с завтрашней датой не существует, то копируем файл с текущей датой (например 2020-07-31.txt) и переименовываем его в завтрашнюю дату (например 2020-08-01.txt).

megaloman 31-07-2020 08:24 2929748

Heavenanvil,
CMD-скрипт при работе с датой получается длинным
Код:

@Echo Off
        Set "BoxIn=Z:\Box_In"
        Set "BoxOut=Z:\Box_Out"
        Set "Delim=-"
        Set /A DeltaDay=1

        FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "ToDay=%%d" &Call Set "ToDay=%%ToDay:~6,2%%.%%ToDay:~4,2%%.%%ToDay:~0,4%%"
        Call :FromDate %DeltaDay% %ToDay% "ToMor"

        Set "ToDay=%ToDay:~-4%%Delim%%ToDay:~3,2%%Delim%%ToDay:~0,2%"
        Set "ToMor=%ToMor:~0,4%%Delim%%ToMor:~4,2%%Delim%%ToMor:~-2%"

        If Not Exist "%BoxIn%\%ToDay%.txt" Exit /B 1
        If Exist "%BoxOut%\%ToMor%.txt" Exit /B 2
       
        Copy "%BoxIn%\%ToDay%.txt" "%BoxOut%\%ToMor%.txt"
Exit /B

:FromDate

rem Пересчет даты на заданное кол-во дней
rem В первом аргументе +- дни
rem Во втором аргументе дата в формате dd.mm.yyyy
rem В третем аргументе имя переменной в кавычках где получим новую дату в формате yyyymmdd

rem Заимствовано http://forum.oszone.net/thread-186889.html
rem вызов Call :FromNow %DeltaDay% %Date% "yyyymmdd"
rem результат в перемменной %yyyymmdd%

 SetLocal
 Set "DT=%~2"
 Set yyyy=%DT:~-4%& set /a mm=100%DT:~3,2%%%100& set /a dd=100%DT:~,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 "%~3=%yyyy%%mm:~-2%%dd:~-2%"
GoTo :Eof

Подозреваю, на PowerShell это делается в одну строку

Heavenanvil 31-07-2020 09:59 2929762

megaloman, на Windows 10 отлично работает.
Только я забыл упомянуть, что использоваться будет в среде Windows XPx32.
А там почему-то не работает.

megaloman 31-07-2020 13:12 2929779

Heavenanvil, У меня в Microsoft Windows XP [Версия 5.1.2600] работает.
Попробуем докапаться, что у Вас не так
Отладочный вариант
Код:

@Echo On
ver

        Set "BoxIn=Z:\Box_In"
        Set "BoxOut=Z:\Box_Out"
        Set "Delim=-"
        Set /A DeltaDay=1

        FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "ToDay=%%d" &Call Set "ToDay=%%ToDay:~6,2%%.%%ToDay:~4,2%%.%%ToDay:~0,4%%"
        Call :FromDate %DeltaDay% %ToDay% "ToMor"

        Set "ToDay=%ToDay:~-4%%Delim%%ToDay:~3,2%%Delim%%ToDay:~0,2%"
        Set "ToMor=%ToMor:~0,4%%Delim%%ToMor:~4,2%%Delim%%ToMor:~-2%"

        If Not Exist "%BoxIn%\%ToDay%.txt" Exit /B 1
        If Exist "%BoxOut%\%ToMor%.txt" Exit /B 2
       
        Copy "%BoxIn%\%ToDay%.txt" "%BoxOut%\%ToMor%.txt"
Exit /B

:FromDate

rem Пересчет даты на заданное кол-во дней
rem В первом аргументе +- дни
rem Во втором аргументе дата в формате dd.mm.yyyy
rem В третем аргументе имя переменной в кавычках где получим новую дату в формате yyyymmdd

rem Заимствовано http://forum.oszone.net/thread-186889.html
rem вызов Call :FromNow %DeltaDay% %Date% "yyyymmdd"
rem результат в перемменной %yyyymmdd%

 SetLocal
 Set "DT=%~2"
 Set yyyy=%DT:~-4%& set /a mm=100%DT:~3,2%%%100& set /a dd=100%DT:~,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 "%~3=%yyyy%%mm:~-2%%dd:~-2%"
GoTo :Eof

1.Сохраните код в файл, например, 200731XP.bat
2. Запустите из командной строки в виде
Код:

200731XP.bat >C:\200731XP.txt 2>&1
3.Прикрепите к сообщению получившийся файл C:\200731XP.txt

Heavenanvil 31-07-2020 16:06 2929791

megaloman, кажется я понял в чём проблема.
В пути к файлам есть кириллические символы и пробелы. Потому, что если запустить в корне диска C:, то всё работает даже в Windows XP.
А так, в логах вместо "C:\Мои документы" пишет "C:\Њ®Ё ¤®Єг¬Ґ*вл".
Пробовал поменять кодировку с помощью "chcp 866" или "chcp 1251 >nul", но всё равно не помогло.

megaloman 31-07-2020 16:39 2929793

Heavenanvil, переименуйте свой батник с "C:\Мои документы" в .txt - файл и приложите к сообщению

Heavenanvil 31-07-2020 18:27 2929797

megaloman, всё получилось у меня. Через Notepad++ сохранил файл в кодировке OEM-866 и код заработал.
Спасибо вам большое!


Время: 23:35.

Время: 23:35.
© OSzone.net 2001-