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

Аватара пользователя
Sta1917

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

Сообщение Sta1917 »

Здравствуйте, есть батник добавляющий дату в начало файла/папки:



Код:

Код: Выделить всё

@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. При копировании: если обнаружена дата, копировалось с текущей датой, а не добавлялась дата к существующей?
Аватара пользователя
Iska

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

Сообщение Iska »

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

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

Сообщение megaloman »

Sta1917, Заново пытался понять постановку. Времени прошло ...


Вот код. Внизу комментарий.

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@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
	Set "To=%~2"
	If "%To:~-1%"=="\" Set "To=%To:~0,-1%"
	Call :MyReName "%In%" "Out"
	If Not Exist "%To%\" Md "%To%"
	If Not Exist "%In%\*.*" (
		Copy "%In%" "%To%\%Out%"
	) Else (
		Xcopy "%In%\*.*" "%To%\%Out%" /H /Y /C /R /D /E /V /I /Q
	)
Exit /B
:MyReName
	Set "In1=%~n1"
	Set "In2=%In1%"
	Echo %~n1| >nul 2>nul FindStr /X /R /C:"^.*20[0-4][0-9][0-1][0-9][0-3][0-9]$" &&Set "In1=%In1:~0,-8%" 
	Echo %~n1| >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:~0,-10%"
	If "%In1%"=="%In2%" (Set "In1=%In1% %CurDate%%~x1") Else (Set "In1=%In1%%CurDate%%~x1")
	If "%~2"=="" (Ren "%In%" "%In1%") Else (Set "%~2=%In1%")
Exit /B
rem Если один аргумент при вызове - переименовываем файл или папку из аргумента
rem А что во втором аргументе??? Это обязательно папка, куда копируем.
rem Смысл копирования: есть некий файл/папка, по мере его/её изменения копируем его/её в состоянии на дату.





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

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

Сообщение Iska »

Цитата Iska:



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




Если там это реализуется проще - покажите пожалуйста




Цитата megaloman:



Sta1917, один батник для всего
CMD/BAT - [решено] Изменение даты в названии файла/папки




Добавляет/изменяет, как сделать копию файла/папки с текущей датой?

Можно ли сделать копирование с добавлением горячей клавиши (например Shift)?

Корректно работает только:



Код:

Код: Выделить всё

%CurDate:~0,8%

можно заставить работать:



Код:

Код: Выделить всё

%date:~6,4%.%date:~3,2%.%date:~0,2%

или

Код:

Код: Выделить всё

%CurDate:~2,6%
Аватара пользователя
Sta1917

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

Сообщение Sta1917 »

Цитата Sta1917:



Здравствуйте, есть батник добавляющий дату в начало файла/папки:
CMD/BAT - [решено] Изменение даты в названии файла/папки




Один аргумент - переименовываем. Например:



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

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



сегодня получим "Z:\тра ля ля\20211123 оба на.ух" "Z:\тра ля ля\20211123 ой ё.mp3"
Цитата Sta1917:



И копирующий файл/папку с добавлением текущей даты:
CMD/BAT - [решено] Изменение даты в названии файла/папки




Два аргумента - копируем. Причём второй - папка, как и в Ваших примерах.
Цитата Sta1917:



Корректно работает только: %CurDate:~0,8%
CMD/BAT - [решено] Изменение даты в названии файла/папки




Естественно:

Дату беру из WMIC (ГГГГММДДччммсс) в CurDate и этот формат не зависит от формата даты, как у Вас настроено в системе.

CurDate=%CurDate:~0,8% выдаёт ГГГГММДД



Не понимаю, что Вас в этом не устраивает. Хотите использовать Date - не смею ограничивать Вашу свободу Изображение

В Вашем примере могу предположить, что Date выдаёт ДД.ММ.ГГГГ, соответственно

Set "CurDate=%Date:~6,4%%Date:~3,2%%Date:~0,2%"


Виноват! Не вник в Ваш код, а Вы не озвучили, Вам хочется формат даты в именах ГГГГ.ММ.ДД,

а я сделал для ГГГГММДД

Исправил

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@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

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

Сообщение megaloman »

Прошу прощения за долгий ответ.

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



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



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

а) добавить дату в название



rename_date.cmd

[spoiler]Код:
[/spoiler]

Код: Выделить всё

set CURDATE=%date:~6,4%.%date:~3,2%.%date:~0,2%
ren %1 "%~d2%~p2%CURDATE% %~n1%~x1"
set CURDATE=









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



copy_date.cmd

[spoiler]Код:
[/spoiler]

Код: Выделить всё

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

[spoiler]Код:
[/spoiler]

Код: Выделить всё

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

[spoiler]Код:
[/spoiler]

Код: Выделить всё

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

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

Сообщение Sta1917 »

Цитата Sta1917:



Прошу прощения за долгий ответ.
CMD/BAT - [решено] Изменение даты в названии файла/папки




Не прошло и десяти лет Изображение
Цитата Sta1917:



предполагая что смогу разнести Ваше решение на два скрипта
CMD/BAT - [решено] Изменение даты в названии файла/папки




зачем это делать?


Цитата megaloman:



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




Я писАтель, а не читатель, тем не менее, при прочтении Ваших батников вижу, что для переименования в Ваш батник передаётся один аргумент: ren %1 ........., а в батники для копирования передаются 2, откуда и куда: copy %1 "%~d2..... Повторюсь, в моём батнике анализируется число аргументов и что это, папка или файл. Что батнику скормите, такой результат и получите.


Ранее не размещал, решил, что не интересно. Вы молчали.

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

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@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

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

Сообщение megaloman »

Цитата megaloman:



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




Кто ж поверит что был без компьютера Изображение


Цитата megaloman:



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




Потому что у меня было два скрипта: один для копирования, другой для вставки. Не думал что это можно в одном совместить.



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

Передается один аргумент - путь до файла/папки. В сообщении со скриптами добавил их названия, ниже reg файлы для их вызова.





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

[spoiler]Код:
[/spoiler]

Код: Выделить всё

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 файл с пунктами меню по добавлению даты к файлу и копированию файла с датой

[spoiler]Код:
[/spoiler]

Код: Выделить всё

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

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

Сообщение Sta1917 »

Цитата Sta1917:



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




Исправлено
Аватара пользователя
megaloman

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

Сообщение megaloman »

Цитата megaloman:





Ранее не размещал, решил, что не интересно. Вы молчали.

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

[spoiler]Код:

@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[/spoiler]


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




Не смог отделить расширение...

Можно сделать чтобы дата с вставлялась/менялась в конце имени файла/папки перед расширением (с пробелом между названием и датой) + три варианта текста после даты (Зам, Ответ, Запрос)?



Могут быть варианты файлов/папок (расширения для примера):

Имя файла 2022.03.28.docx

Имя файла 2022.03.28 Зам.xls

Имя файла 2022.03.28 Ответ.txt

Имя файла 2022.03.28 Запрос
Ответить

Вернуться в «Скриптовые языки администрирования Windows»