|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Скопировать файл и дать ему имя завтрашней даты |
|
CMD/BAT - [решено] Скопировать файл и дать ему имя завтрашней даты
|
Новый участник Сообщения: 6 |
Профиль | Отправить PM | Цитировать Всем привет. Стоит такая задача.
В папке лежат куча 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). |
|
Отправлено: 05:35, 31-07-2020 |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать 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 |
------- Отправлено: 08:24, 31-07-2020 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 6
|
Профиль | Отправить PM | Цитировать megaloman, на Windows 10 отлично работает.
Только я забыл упомянуть, что использоваться будет в среде Windows XPx32. А там почему-то не работает. |
Отправлено: 09:59, 31-07-2020 | #3 |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать 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
2. Запустите из командной строки в виде 3.Прикрепите к сообщению получившийся файл C:\200731XP.txt |
------- Последний раз редактировалось megaloman, 31-07-2020 в 13:17. Отправлено: 13:12, 31-07-2020 | #4 |
Новый участник Сообщения: 6
|
Профиль | Отправить PM | Цитировать megaloman, кажется я понял в чём проблема.
В пути к файлам есть кириллические символы и пробелы. Потому, что если запустить в корне диска C:, то всё работает даже в Windows XP. А так, в логах вместо "C:\Мои документы" пишет "C:\Њ®Ё ¤®Єг¬Ґ*вл". Пробовал поменять кодировку с помощью "chcp 866" или "chcp 1251 >nul", но всё равно не помогло. |
|
Отправлено: 16:06, 31-07-2020 | #5 |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать Heavenanvil, переименуйте свой батник с "C:\Мои документы" в .txt - файл и приложите к сообщению
|
------- Отправлено: 16:39, 31-07-2020 | #6 |
Новый участник Сообщения: 6
|
Профиль | Отправить PM | Цитировать megaloman, всё получилось у меня. Через Notepad++ сохранил файл в кодировке OEM-866 и код заработал.
Спасибо вам большое! |
Отправлено: 18:27, 31-07-2020 | #7 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Скрипт - подключить сетевой диск и назначить ему имя. | bombording | Скриптовые языки администрирования Windows | 18 | 25-07-2018 20:12 | |
CMD/BAT - [решено] скопировать 1 скрытый файл | Alexander_88 | Скриптовые языки администрирования Windows | 5 | 11-09-2014 11:26 | |
Ошибка - Не получается скопировать файл | Teenko | Microsoft Windows 2000/XP | 6 | 16-02-2012 15:17 | |
CMD/BAT - Скопировать папку не имя диска | gen0m.rsw | Скриптовые языки администрирования Windows | 1 | 29-08-2010 19:18 | |
CMD/BAT - файлы вида mmdd*.* - для каждой даты нужно создать каталог, скопировать, файлы | milito | Скриптовые языки администрирования Windows | 2 | 24-05-2009 23:32 |
|