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

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

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

Пользователь


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

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


Здравствуйте, есть батник добавляющий дату в начало файла/папки:
Код: Выделить весь код
@echo off
set CURDATE=%date:~6,4%.%date:~3,2%.%date:~0,2%
ren %1 "%~d2%~p2%CURDATE% %~n1%~x1"
set CURDATE=
И копирующий файл/папку с добавлением текущей даты:
Код: Выделить весь код
@echo off
set CURDATE=%date:~6,4%.%date:~3,2%.%date:~0,2%
`для файлов:
copy %1 "%~d2%~p2%CURDATE% %~n1%~x1"
`для папок:
xcopy %1 "%~d2%~p2%CURDATE% %~n1%~x1" /H /Y /C /R /S /E /V /I /Q
set CURDATE=
Как сделать чтобы:
1. При добавлении: если обнаружена дата в названии файла/папки, она заменялась на текущую, а не добавлялась?
2. При копировании: если обнаружена дата, копировалось с текущей датой, а не добавлялась дата к существующей?

Отправлено: 22:01, 21-11-2021

 

Ветеран


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

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


Для начала — сменить пакетные файлы на что-либо более вменяемое, где есть нормальные регулярные выражения и работа с типом ДатаВремя, например, WSH/PoSH.

Отправлено: 23:55, 21-11-2021 | #2



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

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


Ветеран


Contributor


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

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


Sta1917, один батник для всего
Код: Выделить весь код
@Echo Off
cls & If "%~1"=="" Exit /B
	FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETime /VALUE') DO Set "CurDate=%%d"
	Set "CurDate=%CurDate:~0,8%"

	Set "In=%~1"
	If "%In:~-1%"=="\" Set "In=%In:~0,-1%"

	If "%~2"=="" Call :MyReName "%In%" &Exit /B

	Call :MyReName "%In%" "Out"
	If Not Exist "%In%\*.*" (
		Copy "%In%" "%~dp2%Out%"
	) Else (
		Xcopy "%In%\*.*" "%~dp2%Out%" /H /Y /C /R /D /E /V /I /Q
	)
Exit /B

:MyReName
	Set "In1=%~nx1"
	Echo %~nx1| >nul 2>nul FindStr /X /R /C:"^20[0-4][0-9][0-1][0-9][0-3][0-9].*$"
	If %ErrorLevel%==0 (Set "In1=%CurDate%%In1:~8%") Else (Set "In1=%CurDate% %In1%")
	If "%~2"=="" (Ren "%In%" "%In1%") Else (Set "%~2=%In1%")
Exit /B

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


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

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

Отправлено: 08:34, 22-11-2021 | #3


Пользователь


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

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


Цитата Iska:
Для начала — сменить пакетные файлы на что-либо более вменяемое, где есть нормальные регулярные выражения и работа с типом ДатаВремя, например, WSH/PoSH »
Если там это реализуется проще - покажите пожалуйста

Цитата megaloman:
Sta1917, один батник для всего »
Добавляет/изменяет, как сделать копию файла/папки с текущей датой?
Можно ли сделать копирование с добавлением горячей клавиши (например Shift)?
Корректно работает только:
Код: Выделить весь код
%CurDate:~0,8%
можно заставить работать:
Код: Выделить весь код
%date:~6,4%.%date:~3,2%.%date:~0,2%
или
Код: Выделить весь код
%CurDate:~2,6%

Отправлено: 11:35, 23-11-2021 | #4


Ветеран


Contributor


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

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


Цитата Sta1917:
Здравствуйте, есть батник добавляющий дату в начало файла/папки: »
Один аргумент - переименовываем. Например:

batnik.bat "Z:\тра ля ля\оба на.ух"
batnik.bat "Z:\тра ля ля\20011231 ой ё.mp3"

сегодня получим "Z:\тра ля ля\20211123 оба на.ух" "Z:\тра ля ля\20211123 ой ё.mp3"
Цитата Sta1917:
И копирующий файл/папку с добавлением текущей даты: »
Два аргумента - копируем. Причём второй - папка, как и в Ваших примерах.
Цитата Sta1917:
Корректно работает только: %CurDate:~0,8% »
Естественно:
Дату беру из WMIC (ГГГГММДДччммсс) в CurDate и этот формат не зависит от формата даты, как у Вас настроено в системе.
CurDate=%CurDate:~0,8% выдаёт ГГГГММДД

Не понимаю, что Вас в этом не устраивает. Хотите использовать Date - не смею ограничивать Вашу свободу
В Вашем примере могу предположить, что Date выдаёт ДД.ММ.ГГГГ, соответственно
Set "CurDate=%Date:~6,4%%Date:~3,2%%Date:~0,2%"
Виноват! Не вник в Ваш код, а Вы не озвучили, Вам хочется формат даты в именах ГГГГ.ММ.ДД,
а я сделал для ГГГГММДД
Исправил
Код: Выделить весь код
@Echo Off
cls & If "%~1"=="" Exit /B
	FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETime /VALUE') DO Set "CurDate=%%d"
	Set "CurDate=%CurDate:~0,4%.%CurDate:~4,2%.%CurDate:~6,2%"

	Set "In=%~1"
	If "%In:~-1%"=="\" Set "In=%In:~0,-1%"

	If "%~2"=="" Call :MyReName "%In%" &Exit /B

	Call :MyReName "%In%" "Out"
	If Not Exist "%In%\*.*" (
		Copy "%In%" "%~dp2%Out%"
	) Else (
		Xcopy "%In%\*.*" "%~dp2%Out%" /H /Y /C /R /D /E /V /I /Q
	)
Exit /B

:MyReName
	Set "In1=%~nx1"
	Echo %~nx1| >nul 2>nul FindStr /X /R /C:"^20[0-4][0-9]\.[0-1][0-9]\.[0-3][0-9].*$"
	If %ErrorLevel%==0 (Set "In1=%CurDate%%In1:~10%") Else (Set "In1=%CurDate% %In1%")
	If "%~2"=="" (Ren "%In%" "%In1%") Else (Set "%~2=%In1%")
Exit /B
При смене формата даты в именах файлов надо переделывать регулярку для определения имеющейся даты в имени и формирование даты.

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


Последний раз редактировалось megaloman, 07-04-2022 в 17:18.


Отправлено: 15:18, 23-11-2021 | #5


Пользователь


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

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


Прошу прощения за долгий ответ.
Ув. megaloman я спутал теплое с мягким, предполагая что смогу разнести Ваше решение на два скрипта.

При выделении и вызове контекстного меню по правой кнопке мыши появляются два пункта, они разные, в зависимости от того файл это или папка.

1. При выделении файла и вызове контестного меню по правой кнопке мыши настроены два пункта:
а) добавить дату в название
rename_date.cmd

Код: Выделить весь код
set CURDATE=%date:~6,4%.%date:~3,2%.%date:~0,2%
ren %1 "%~d2%~p2%CURDATE% %~n1%~x1"
set CURDATE=


б) копировать с датой
copy_date.cmd

Код: Выделить весь код
set CURDATE=%date:~6,4%.%date:~3,2%.%date:~0,2%
copy %1 "%~d2%~p2%CURDATE% %~n1%~x1"
set CURDATE=


2. При выделении папки и вызове контестного меню по правой кнопке мыши настроены два пункта:

а) добавить дату к папке
add_date_to_name_folder.cmd

Код: Выделить весь код
set CURDATE=%date:~6,4%.%date:~3,2%.%date:~0,2%
ren %1 "%~d2%~p2%CURDATE% %~n1%~x1"
set CURDATE=


б) копировать папку с датой
copy_and_add_date_to_name_folder.cmd

Код: Выделить весь код
set CURDATE=%date:~6,4%.%date:~3,2%.%date:~0,2%
xcopy %1 "%~d2%~p2%CURDATE% %~n1%~x1" /H /Y /C /R /S /E /V /I /Q
set CURDATE=


Соответственно вопросы те же, как сделать:
1. При добавлении: если обнаружена дата в названии файла/папки, она заменялась на текущую, а не добавлялась?
2. При копировании: если обнаружена дата, копировалось с текущей датой, а не добавлялась дата к существующей?

Последний раз редактировалось Sta1917, 08-12-2021 в 09:12. Причина: Добавил наименования скриптов, поместил их под спойлер


Отправлено: 00:05, 05-12-2021 | #6


Ветеран


Contributor


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

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


Цитата Sta1917:
Прошу прощения за долгий ответ. »
Не прошло и десяти лет
Цитата Sta1917:
предполагая что смогу разнести Ваше решение на два скрипта »
зачем это делать?
Цитата megaloman:
один батник для всего »
Я писАтель, а не читатель, тем не менее, при прочтении Ваших батников вижу, что для переименования в Ваш батник передаётся один аргумент: ren %1 ........., а в батники для копирования передаются 2, откуда и куда: copy %1 "%~d2..... Повторюсь, в моём батнике анализируется число аргументов и что это, папка или файл. Что батнику скормите, такой результат и получите.
Ранее не размещал, решил, что не интересно. Вы молчали.
Вот вариант, который на входе понимает файл/папку с датой в начале названия с произвольными разделителями или без оного, и вставляет дату с нужным Вам разделителем.
Код: Выделить весь код
@Echo Off
cls & If "%~1"=="" Exit /B

	Set "Delim="
	Set "Delim=-"
	FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETime /VALUE') DO Set "CurDate=%%d"
	Set "CurDate=%CurDate:~0,4%%Delim%%CurDate:~4,2%%Delim%%CurDate:~6,2%"

	Set "In=%~1"
	If "%In:~-1%"=="\" Set "In=%In:~0,-1%"

	If "%~2"=="" Call :MyReName "%In%" &Exit /B

	Call :MyReName "%In%" "Out"
	If Not Exist "%In%\*.*" (
		Copy "%In%" "%~dp2%Out%"
	) Else (
		Xcopy "%In%\*.*" "%~dp2%Out%" /H /Y /C /R /D /E /V /I /Q
	)
Exit /B

:MyReName
	Set "In1=%~nx1"
	Set "In2=%In1%"
	Echo %~nx1| >nul 2>nul FindStr /X /R /C:"^20[0-4][0-9][0-1][0-9][0-3][0-9].*$" &&Set "In1=%In1:~8%" 
	Echo %~nx1| >nul 2>nul FindStr /X /R /C:"^20[0-4][0-9][^0-9][0-1][0-9][^0-9][0-3][0-9].*$" &&Set "In1=%In1:~10%"
	If "%In1%"=="%In2%" (Set "In1=%CurDate% %In1%") Else (Set "In1=%CurDate%%In1%")
	If "%~2"=="" (Ren "%In%" "%In1%") Else (Set "%~2=%In1%")
Exit /B

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


Последний раз редактировалось megaloman, 07-04-2022 в 17:19. Причина: Исправлена ошибка, указанная Sta191

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

Отправлено: 21:23, 05-12-2021 | #7


Пользователь


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

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


Цитата megaloman:
Не прошло и десяти лет »
Кто ж поверит что был без компьютера
Цитата megaloman:
зачем это делать? »
Потому что у меня было два скрипта: один для копирования, другой для вставки. Не думал что это можно в одном совместить.

Два аргумента... в найденном примере так было, у меня заработало. В ком.строке отображается: ren "C:\Users\User\Folder" "2021.12.08 Folder"
Передается один аргумент - путь до файла/папки. В сообщении со скриптами добавил их названия, ниже reg файлы для их вызова.

Reg файл с пунктами меню по добавлению даты к папке и копированию папки с датой

Код: Выделить весь код
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\CopyAndAddDateToNameFolder]
"MUIVerb"="Копировать папку с датой"
"Position"="Top"
"icon"="imageres.dll,321"

[HKEY_CLASSES_ROOT\Directory\shell\CopyAndAddDateToNameFolder\command]
@="\"C:\\TemplatesFolders\\copy_and_add_date_to_name_folder.cmd\"  \"%1\""

[HKEY_CLASSES_ROOT\Directory\shell\AddDateToNameFolder]
"MUIVerb"="Добавить дату к папке"
"Position"="Top"
"icon"="shell32.dll,45"

[HKEY_CLASSES_ROOT\Directory\shell\AddDateToNameFolder\command]
@="\"C:\\TemplatesFolders\\add_date_to_name_folder.cmd\"  \"%1\""


Reg файл с пунктами меню по добавлению даты к файлу и копированию файла с датой

Код: Выделить весь код
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\CopyAndAddDateToNameFile]
"MUIVerb"="Копировать с датой"
"icon"="shell32.dll,68"

[HKEY_CLASSES_ROOT\*\shell\CopyAndAddDateToNameFile\command]
@="\"C:\\TemplatesFolders\\copy_date.cmd\" \"%1\""

[HKEY_CLASSES_ROOT\*\shell\AddDateToNameFile]
"MUIVerb"="Добавить дату в название"
"icon"="shell32.dll,299"

[HKEY_CLASSES_ROOT\*\shell\AddDateToNameFile\command]
@="\"C:\\TemplatesFolders\\rename_date.cmd\" \"%1\""


Ваш скрипт из последнего сообщения изменяет дату, но если дата уже была текущей - добавляет её еще раз.

Должно получиться две функции (вызывать буду через контекстное меню по правой кнопке мыши):
1 Добавить/изменить дату у файла/папки на текущую.
2 Скопировать файл/папку и добавить/изменить дату на текущую.

Последний раз редактировалось Sta1917, 08-12-2021 в 12:41.


Отправлено: 09:27, 08-12-2021 | #8


Ветеран


Contributor


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

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


Цитата Sta1917:
Ваш скрипт из последнего сообщения изменяет дату, но если дата уже была текущей - добавляет её еще раз. »
Исправлено

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

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

Отправлено: 22:52, 09-12-2021 | #9


Пользователь


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

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


Цитата megaloman:
Ранее не размещал, решил, что не интересно. Вы молчали.
Вот вариант, который на входе понимает файл/папку с датой в начале названия с произвольными разделителями или без оного, и вставляет дату с нужным Вам разделителем.

Код:
@Echo Off
cls & If "%~1"=="" Exit /B
Set "Delim="
Set "Delim=-"
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETime /VALUE') DO Set "CurDate=%%d"
Set "CurDate=%CurDate:~0,4%%Delim%%CurDate:~4,2%%Delim%%CurDate:~6,2%"
Set "In=%~1"
If "%In:~-1%"=="\" Set "In=%In:~0,-1%"
If "%~2"=="" Call :MyReName "%In%" &Exit /B
Call :MyReName "%In%" "Out"
If Not Exist "%In%\*.*" (
Copy "%In%" "%~dp2%Out%"
) Else (
Xcopy "%In%\*.*" "%~dp2%Out%" /H /Y /C /R /D /E /V /I /Q
)
Exit /B
:MyReName
Set "In1=%~nx1"
Set "In2=%In1%"
Echo %~nx1| >nul 2>nul FindStr /X /R /C:"^20[0-4][0-9][0-1][1-9][0-3][0-9].*$" &&Set "In1=%In1:~8%"
Echo %~nx1| >nul 2>nul FindStr /X /R /C:"^20[0-4][0-9][^0-9][0-1][1-9][^0-9][0-3][0-9].*$" &&Set "In1=%In1:~10%"
If "%In1%"=="%In2%" (Set "In1=%CurDate% %In1%") Else (Set "In1=%CurDate%%In1%")
If "%~2"=="" (Ren "%In%" "%In1%") Else (Set "%~2=%In1%")
Exit /B
»
Не смог отделить расширение...
Можно сделать чтобы дата с вставлялась/менялась в конце имени файла/папки перед расширением (с пробелом между названием и датой) + три варианта текста после даты (Зам, Ответ, Запрос)?

Могут быть варианты файлов/папок (расширения для примера):
Имя файла 2022.03.28.docx
Имя файла 2022.03.28 Зам.xls
Имя файла 2022.03.28 Ответ.txt
Имя файла 2022.03.28 Запрос

Отправлено: 21:32, 28-03-2022 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Изменение даты и времени создания файла timasadovykh@vk Скриптовые языки администрирования Windows 7 30-01-2021 21:37
VBS/WSH/JS - изменение даты/времени папки по ее имени pzh2393 Скриптовые языки администрирования Windows 1 31-12-2017 07:12
Любой язык - изменение даты/времени папки по ее имени pzh2393 Скриптовые языки администрирования Windows 0 17-12-2017 17:34
VBS/WSH/JS - изменение даты создания файла на минус Х дней nixdorf13 Скриптовые языки администрирования Windows 2 08-06-2015 14:26
CMD/BAT - [решено] Анализ на количество символов в названии файла/папки айкот Скриптовые языки администрирования Windows 8 04-10-2011 16:12




 
Переход