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

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

Ответить
Настройки темы
CMD/BAT - Поиск и переименование файлов с помощью BATника

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


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

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


Помогите написать!
Нужен батник, который бы сканировал определенный путь (который пропишем) на изминенные СЕГОДНЯ (текущая дата) файлы, смотрел на имя файла, и на дату изменения, если файл имеет имя тест.xlsx и изменен сегодняшней датой, то переименовывал на 210831 тест.xlsx (текущей датой), если есть файл с именем 210826 тест2.xlsx, который менялся 5 дней назад, и сегодня повторно изменился, то менял первые 6 символов на текущую дату изменения, если маски в виде 210826 нет вообще в имени файла то переименовывал в текущую дату изменения. Как я вижу, +-

@echo off
set thePATH=C:\temp
for /F "tokens=1-4 usebackq delims=. " %%1 in (`date /t`) do set mydate=%4%%3%%2%%1
ren test.xlsx %mydate%test.xlsx

Еще думаю нужно копать сюда -
Отслеживать изменения в файлах можно с помощью аттрибута "архивный".
Этот аттрибут выставляется автоматически ОС при любом изменении файла.
Вывести список файлов, у которых аттрибут "архивный" с помощью dir /a:a
Получить дату/время изменения файла можно с помощью модификаторов переменной цикла. Возможно for /
После переименования файла нужно снимать аттрибут архивный - это будет признак того, что файл уже обработан и в следующий раз он в обработку не попадет (если не будет модифицирован). Сделать это можно командой возможно attrib /?

Помогите дописать))

Отправлено: 15:36, 31-08-2021

 

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


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

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


megaloman, не могу понять как заставить переходить по этому пути: "C:\Users\%USERNAME%\Documents\Bitrix24\КМ НЗЧ\210831 ЕВРОПА\210830 Заказы УКРАИНА\.."
тут есть кириллица, сохранил в кодировке 866, все равно не видит

Может быть связано с тем что папка Bitrix24 это как виртуальный диск ?

Отправлено: 14:26, 01-09-2021 | #21



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

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


Ветеран


Contributor


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

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


Вложения
Тип файла: txt я21090113.bat.txt
(924 байт, 3 просмотров)
Тип файла: txt я21090113-1251.bat.txt
(940 байт, 0 просмотров)

реально еще вывести в окно cmd кол-во измененных файлов
Код: Выделить весь код
@Echo Off
cls
	Set "BoxIn=Z:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ\210831 ЕВРОПА\210830 Заказы УКРАИНА"
	Set "Mask=*.xlsx"
	Set "DateMask=^[2-9][0-9][0-1][0-9][0-3][0-9] .*"

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


	Pushd "%BoxIn%" ||(Echo Filder "%BoxIn%" not found &Pause &Exit /B 1) 
	
	Set /A N=0
	For /F "usebackq delims=" %%f In (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D /O:-D /T:W`) Do (
		For /F "delims= " %%d In ("%%~tf") Do (
			If "%Date%"=="%%d" (
				Set "Name=%%f"
				Call Echo %%Name%%| >nul 2>&1 FindStr /I /X /R /C:"%DateMask%" &&Call Set "Name=%%Name:~7%%"
				Call ReName "%%f" "%MyDate%%%Name%%"
				Call Set /A N+=1
				Call Echo %%N%%	"%%f"	"--->"	"%MyDate%%%Name%%"
			) Else (
				GoTo :Continue
			)
		) 
	)
	:Continue
	Echo === Changed %N% files today
	Popd
pause
Exit /B 0
Прикрепил два файла - один в 866 кодировке, другой в 1251, кроме кодировки отличаются только одной строкой >nul chcp 1251
Цитата ovrtke:
Может быть связано с тем что папка Bitrix24 это как виртуальный диск »
Я не могу воспроизвести такую ситуацию, я формально создал папку на своём диске Z:, Вы поставьте нужный. А в тотал-коммандере, например, по какому пути Вы можете видеть эту папку?

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


Отправлено: 15:05, 01-09-2021 | #22


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


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

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


megaloman, в тотале путь такой - "c:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ\210831 ЕВРОПА\210830 Заказы УКРАИНА\210622 Заказ.xlsx"
borisov.a - заменим на %USERNAME% как я понимаю и думаю правильней, ну а дальше без изменений, только вылетается еррор - Синтаксическая ошибка в имени файла, имени папки или метке тома.

Починил, работает!) Огромаднейшее спасибо!

Отправлено: 15:09, 01-09-2021 | #23


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


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

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


megaloman, а такой вопрос, думаю углубится, а реально ли сделать так что бы и папка меняла имя так точно как и файл измененный в ней ? по тому же принципу

Отправлено: 16:43, 01-09-2021 | #24


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


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

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


В идеале все, например структура 3х уровневая

Если структура Dir-> Dir-1-> Dir-2 - и в ней файл, меняем и файл и папки все которые связанные, ведь по сути я ж был в етой папке. Проблем с доступом не будет, т.е. конфликтов с доступом точно как с папками так и с файлами, т.к. это будет делаться в конце рабочего дня. Меняем папку по дате последнего измененного в ней файла, если файлов несколько в папке, но менялся только один, меняем и этот файл и папку целиком

Цитата megaloman:
....\210831 ЕВРОПА\210830 Заказы ....\ »
тут по аналогии с файлом, т.е. не важно есть дата нет даты, затираем и ставим новую, в проводнике если смотреть, в папке внутри которой проводились изменения, напротив папки тоже есть дата изменения, следовательно косвенно она тоже изменялась)

Отправлено: 17:44, 01-09-2021 | #25


Ветеран


Contributor


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

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


Вложения
Тип файла: txt я21090118.bat.txt
(1.6 Kb, 2 просмотров)

ovrtke,
Если структура Dir-> Dir-1-> Dir-2
Моя тестовая структура (я показываю только папки, верьте мне, если нужно - файлы там переименовываются, не хочу засорять пост)
Код: Выделить весь код
Z:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ
Z:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ\210901 Африка
Z:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ\210901 ЕВРОПА
Z:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ\Азия
Z:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ\210901 Африка\210901 Заказы Берег Слоновой Кости
Z:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ\210901 Африка\Заказы Нигерия
Z:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ\210901 ЕВРОПА\210901 Заказы Россия
Z:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ\210901 ЕВРОПА\210901 Заказы УКРАИНА
Z:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ\210901 ЕВРОПА\Заказы Беларусь
Z:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ\Азия\Заказы Индия
Z:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ\Азия\Заказы Китай
Код: Выделить весь код
@Echo Off
cls
>nul Chcp 1251

	Set "BoxIn=Z:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ"

	Set "Mask=*.xlsx"
	Set "DateMask=^[2-9][0-9][0-1][0-9][0-3][0-9] .*"

	If Not Exist "%BoxIn%" (Echo Filder "%BoxIn%" not found &Pause &Exit /B 1) 

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

	Set /A Ntotal=0
	For /F "usebackq delims=" %%a In (`2^>nul Dir "%BoxIn%\*.*" /B /A:D`) Do (
		Set /A Na=0
		For /F "usebackq delims=" %%b In (`2^>nul Dir "%BoxIn%\%%a\*.*" /B /A:D`) Do (
			Call :ReFiles "%BoxIn%\%%a\%%b\%Mask%" "Ni" "%%a\%%b\" ||Call :Redir "%%b" "%BoxIn%\%%a\%%b" %%Ni%%
			Call Set /A Na+=%%Ni%%
			Call Set /A Ntotal+=%%Ni%%
		)
		Call :Redir "%%a" "%BoxIn%\%%a" %%Na%%
	)
	Echo ======	Changed %NTotal% files today
pause
Exit /B 0

:ReFiles
	Set /A N=0
	Pushd "%~dp1" ||Exit /B 0
		For /F "usebackq delims=" %%f In (`2^>nul Dir %1 /B /A:-D /O:-D /T:W`) Do (
			For /F "delims= " %%d In ("%%~tf") Do (
				If "%Date%"=="%%d" (
					Set "Name=%%f"
					Call Echo %%Name%%| >nul 2>&1 FindStr /I /X /R /C:"%DateMask%" &&Call Set "Name=%%Name:~7%%"
					>nul Call ReName "%%f" "%MyDate%%%Name%%"
					Call Set /A N+=1
					Call Echo %%N%%	"%%a\%%b\%%f"	"--->""%MyDate%%%Name%%"
				) Else (GoTo :Continue)
			) 
		)
	:Continue
	Set /A %~2=%N%
	Popd
If %N%==0 (Exit /B 0) Else (Exit /B 1)

:ReDir
	If "%3"=="0" Exit /B 0
	Set "Name=%~1"
	Call Echo %%Name%%| >nul 2>&1 FindStr /I /X /R /C:"%DateMask%" &&Call Set "Name=%%Name:~7%%"
	>nul Call ReName %2 "%MyDate%%%Name%%"
	Call Echo ===	"%~nx2"	"--->""%MyDate%%%Name%%"
Exit /B 0

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


Отправлено: 21:31, 01-09-2021 | #26


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


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

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


Затестирую отпишусь)

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


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


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

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


megaloman, а батник сканирует определенную структуру ? просто попробовал сделать так:

Путь - C:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ\210901 МУЗ-проценщик\test\test.xlsx

Результат - C:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ\210902 МУЗ-проценщик\210902 test\210902 test.xlsx - как бы все ок, все отлично

Но, если добавить в папку 210902 test еще пару папок и туда положить несколько файлов, он их не видит....как расширить дерево сканирования до 5-10 внутренних папок например ?

Отправлено: 13:24, 02-09-2021 | #28


Ветеран


Contributor


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

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


батник сканирует определенную структуру, как Вы заказывали
Код: Выделить весь код
Dir
	Dir1
		Dir11
			Файлы.xlsx
		Dir12
			Файлы.xlsx
		Dir13
			Файлы.xlsx
		.....
		.....
	Dir2
		Dir21
			Файлы.xlsx
		Dir22
			Файлы.xlsx
		Dir23
			Файлы.xlsx
		.....
		.....
	Dir3
		Dir31
			Файлы.xlsx
		Dir32
			Файлы.xlsx
		Dir33
			Файлы.xlsx
		.....
		.....
	.............
	.............
	.............

Я не понимаю Вашу проблему. Если файл сегодня изменялся, он будет переименован, будет переименована папка, где он находится, будет переименована папка, в которой находится эта папка. То, что Вы изобразили, не вписывается в этот алгоритм. Никаких ограничений на количество папок DirX и вложенных в них подпапок DirXi нет. Главное, чтобы в папке DirXi хоть один файл был сегодня изменен. Проверил еще раз.

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


Последний раз редактировалось megaloman, 02-09-2021 в 15:05.


Отправлено: 15:00, 02-09-2021 | #29


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


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

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


Хм, странно, чего у меня тогда не переименовывает вниз ?

Отправлено: 15:12, 02-09-2021 | #30



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Копирование папки с файлами с помощью batника Stgean Скриптовые языки администрирования Windows 6 19-04-2019 12:00
CMD/BAT - Поиск и копирование файлов с помощью пакетного файла. Svtln Скриптовые языки администрирования Windows 4 09-04-2017 18:03
CMD/BAT - Архивирование, переименование и перемещение файлов с помощью BAT-файла kirillius Скриптовые языки администрирования Windows 7 13-05-2016 12:57
CMD/BAT - Поиск, переименование и создание Дима_Качуров@vk Скриптовые языки администрирования Windows 2 25-07-2012 15:27
[решено] поиск и переименование файлов exo Хочу все знать 5 26-08-2011 17:05




 
Переход