Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Скопировать файл и дать ему имя завтрашней даты

Ответить
Настройки темы
CMD/BAT - [решено] Скопировать файл и дать ему имя завтрашней даты

Новый участник


Сообщения: 6
Благодарности: 1

Профиль | Отправить 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

 

Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить 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
Подозреваю, на PowerShell это делается в одну строку

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:24, 31-07-2020 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 6
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

Отправлено: 09:59, 31-07-2020 | #3


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить 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
1.Сохраните код в файл, например, 200731XP.bat
2. Запустите из командной строки в виде
Код: Выделить весь код
200731XP.bat >C:\200731XP.txt 2>&1
3.Прикрепите к сообщению получившийся файл C:\200731XP.txt

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 31-07-2020 в 13:17.

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:12, 31-07-2020 | #4


Новый участник


Сообщения: 6
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

Отправлено: 16:06, 31-07-2020 | #5


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:39, 31-07-2020 | #6


Новый участник


Сообщения: 6
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

Отправлено: 18:27, 31-07-2020 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Скопировать файл и дать ему имя завтрашней даты

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход