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

Компьютерный форум 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 | Цитировать


Изображения
Тип файла: jpg Screenshot_9.jpg
(63.3 Kb, 2 просмотров)

Вот что пишет, хотя файл переименован в папке рррр

C:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ\210902 МУЗ-проценщик\210902 test\rrrr\pppp\
меняет только первые две, в папке rrrr - файлов нет, может быть изза етого ?
попробовал положить файл в папку rrrr, аналогично, не переименовывает

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



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

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


Ветеран


Contributor


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

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


ovrtke, Вы запрашивали:
Цитата ovrtke:
В идеале все, например структура 3х уровневая
Если структура Dir-> Dir-1-> Dir-2 »
Вы это получили. Теперь Вы хотите структуру произвольного уровня - это уже другая задача. Вы изначально не сформулировали задачу, не получили, что подразумевали, поэтому, похоже, ни один приведенный код Вы не сочли полезным. Надо думать ...

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

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

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


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


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

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


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

Отправлено: 16:07, 02-09-2021 | #33


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


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

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


megaloman, последний вариант, сделать поиск от прописанного пути -> до конечного, либо как реально увеличить глубину поиска ?)

Отправлено: 09:20, 03-09-2021 | #34


Ветеран


Contributor


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

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


ovrtke, Поиск надо делать вверх ногами и рекурсия не нужна. Переименование файлов делается "на раз", с цепочкой папок надо было сообразить.
Поиск в папках произвольной вложенности
Код: Выделить весь код
@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] .*"

	Pushd "%BoxIn%" ||(Echo Folder "%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=" %%d In (`2^>nul Dir "%BoxIn%\*.*" /B /A:D /S ^|Sort /R`) Do (
		Set /A Na=0
		Call :ReFiles "%%d\%Mask%" "Ni"
	)

	Echo ======	Changed %NTotal% files today
	Popd
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 "%~dp1%%f" "%MyDate%%%Name%%"
					Call Set /A N+=1
					Call Echo %%N%%	"%~dp1%%f"	"--->""%MyDate%%%Name%%"
				) Else (GoTo :Continue)
			) 
		)
	:Continue
	Set /A %~2=%N%
	Set /A NTotal+=%N%
	Popd
	Set "DirName=%~dp1"
	If Exist "%~dp1%MyDate%*.*" Call :Redir "%%DirName:~0,-1%%"
Exit /B 0

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

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


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

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

Отправлено: 13:23, 03-09-2021 | #35


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


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

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


megaloman, вы БОГ! Тему можно считать закрытой, +100 в КАРМУ!

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


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


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

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


megaloman, доброго времени суток! Обращусь к вам еще с одной просьбой

1) Set "Mask=*.xlsx" - тут можно перечислить расширение не только .xlsx а допустим и .doc ?
2) Pushd "%BoxIn%" ||(Echo Folder "%BoxIn%" not found &Pause &Exit /B 1) - как вывести в окно cmd сканируемую категорию ?

Заранее очень благодарен за скорейший ответ

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


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


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

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


Цитата megaloman:
Эти файлы рассматриваются независимо, то есть берём самый свежий *.xlsx и .doc? »
да, тот же принцип что и с .xlsx, т.е. берем самый свежий .xls, .doc

Цитата megaloman:
В смысле, что Вы хотите видеть? Каждую подпапку, которая обрабатывается? »
просто вывести путь который указываем в BoxIn=Z:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ

Отправлено: 16:07, 15-09-2021 | #38


Ветеран


Contributor


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

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


Можно задавать список масок файлов
Код: Выделить весь код
@Echo Off
cls
>nul Chcp 1251
	Set "BoxIn=Z:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ"

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

	Pushd "%BoxIn%" ||(Echo Folder "%BoxIn%" not found &Pause &Exit /B 1) 
	Echo +++ Processing files Mask=%Mask% Folder="%BoxIn%" 

	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=" %%d In (`2^>nul Dir "%BoxIn%\*.*" /B /A:D /S ^|Sort /R`) Do (
		Set /A Na=0
		Call :ReFiles "%%d" "%Mask%" "Ni"
	)

	Echo === Changed %NTotal% files today. Folder="%BoxIn%" Mask=%Mask%
	Popd
pause
Exit /B 0

:ReFiles
	Set /A N=0
	Pushd "%~1" ||Exit /B 0
		For /F "usebackq delims=" %%f In (`2^>nul Dir %~2 /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 "%~1\%%f" "%MyDate%%%Name%%"
					Call Set /A N+=1
					Call Echo %%N%%	"%~1\%%f"	"--->""%MyDate%%%Name%%"
				) Else (GoTo :Continue)
			) 
		)
	:Continue
	Set /A %~3=%N%
	Set /A NTotal+=%N%
	Popd
	If Exist "%~1\%MyDate%*.*" Call :Redir %1
Exit /B 0

:ReDir
	Set "Name=%~nx1"
	Call Echo %%Name%%| >nul 2>&1 FindStr /I /X /R /C:"%DateMask%" &&Call Set "Name=%%Name:~7%%"
	>nul Call ReName %1 "%MyDate%%%Name%%" &&Call Echo ===	"%~nx1"	"--->""%MyDate%%%Name%%" ||Echo ???	%1
Exit /B 0
Еще слегка халтурный вариант
Код: Выделить весь код
@Echo Off
cls
>nul Chcp 1251
	Call :Extension "Z:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ" "*.xlsx"
	Call :Extension "Z:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ" "*.doc"
pause
Exit /B 0

:Extension
	Set "BoxIn=%~1"
	Set "Mask=%~2"
	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 &Exit /B 1) 

	Echo.
	Echo +++ Processing files Mask=%2 Folder=%1 

	Pushd "%BoxIn%" ||(Echo Folder "%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=" %%d In (`2^>nul Dir "%BoxIn%\*.*" /B /A:D /S ^|Sort /R`) Do (
		Set /A Na=0
		Call :ReFiles "%%d\%Mask%" "Ni"
	)

	Echo === Changed %NTotal% files today. Folder=%1 Mask=%2
	Popd
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 "%~dp1%%f" "%MyDate%%%Name%%"
					Call Set /A N+=1
					Call Echo %%N%%	"%~dp1%%f"	"--->""%MyDate%%%Name%%"
				) Else (GoTo :Continue)
			) 
		)
	:Continue
	Set /A %~2=%N%
	Set /A NTotal+=%N%
	Popd
	Set "DirName=%~dp1"
	If Exist "%~dp1%MyDate%*.*" Call :Redir "%%DirName:~0,-1%%"
Exit /B 0

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

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


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

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

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


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


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

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


megaloman, Боженька

Отправлено: 17:39, 15-09-2021 | #40



Компьютерный форум 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




 
Переход