![]() |
Поиск и переименование файлов с помощью BATника
Помогите написать!
Нужен батник, который бы сканировал определенный путь (который пропишем) на изминенные СЕГОДНЯ (текущая дата) файлы, смотрел на имя файла, и на дату изменения, если файл имеет имя тест.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 /? Помогите дописать)) |
1. А зачем все эти переименования файлов, если дату изменения файла легко вывести и так, и произвести необходимые манипуляции? Какая конечная цель этого переименования?
2. Чем геморроиться с батниками, осваивайте Powershell, где работать с метками файлов на порядок проще. Например, вывести имена файлов и даты изменения и отсортировать по дате изменения: Код:
dir "C:\Windows" |select name,LastWriteTime |sort lastwritetime |
Код:
@Echo Off Иначе понадобятся небольшие корректировки. |
Цитата:
Цитата:
Еще ньюанс, если файл уже был изменен например вчера и имеет имя - 210831 тест.xlsx, я его открываю сегодня, т.е. 01.09, сохраняю и запускаю батник, он должен находить имена файлов которые начинаются на 21**** и заменять эти символы на текущую дату, дата использования батника будет с 01.09, т.е. потенциально файлы все будут начинаться на 21(м)(д) имя.расширение |
Цитата:
|
ovrtke, речь идет о формате даты в системе. То есть, как отображается дата в командах
Echo %date% Dir. Результат батника - "ггммдд имяфайла.xlsx" где ггммдд сформирован из сегодняшней даты. Пробуйте, спрашивайте. |
Вложений: 1
Цитата:
|
Вложений: 1
Цитата:
|
Придумал как сделать, только нужен небольшой upgrade. Нужно дописать если файл содержит вначале "21**** имя.xlsx" - удалять первые 6 символов и заменять на текущую дату. Проверил, батник переименовывает датой когда последняя дата изменения файла была, если ты открываешь документ - чего то меняешь и сохраняешь и запускаешь батник он переименовывает вот так: - 210901 210831 test.txt - т.е. вчерашнюю дату не изменяет и не удаляет а добавляет новую. Если имя файла было тест.xlsx и изменение было 210808 то батник переименовывает его как 210808 тест.xlsx. Помогите сделать апргрейд кода ))
У меня мысли крутятся, что нужно добавить: выделить подстроку с помощью set и запихнуть в if и прописать условие поиске, если 21**** тест.xlsx то удаляем первые 6 символов и заменяем их на текущие, как это сделать не пойму Код:
@echo off |
ОК, а как вы поймёте, кто изменял?
|
Цитата:
Есть общая папка, в которой работают 3-4 человека, в день открывается/добавляется/изменяется от 30-50 файлов, и сохранять ручками с текущей датой все то что ты открыл/изменил/сохранил не хочется, просто нужно запустить батник, он все изменит (все что ты сохранил/изменил/добавил) на текущую дату и все. В этой общей папке видно кто под каким паролем их сохранял/изменял, нам по большому счету не нужно, нужно лишь изменять на текущую дату изменения и все мне осталось допилить что бы, если файл имеет имя уже с текущей датой, либо старой, и заново не прописывалась дата, а удалялась старая и ставилась новая, и побольшому счету проблема решена :) |
Всё равно непонятно, зачем переименовывать. Если нужно просто получать отчёт об изменённых файлах за сегодня в целях мониторинга, ничего переименовывать не требуется.
|
Цитата:
|
ovrtke,
Цитата:
Код:
Set "BoxIn=Z:\Box_In" Я делаю тупо и дубОво: я анализирую сегодняшнюю дату (%Date%) c датой/временем модификации файла из Dir (%%~tf), усеченной до даты. Выделяю имя файла: если оно без даты "ггммдд " впереди, то беру его как есть "имябездаты", а если впереди дата, её из имени отбрасываю, получаю "имябездаты"и переименовываю файл с исходным именем в "ггммдд имябездаты" и не завихряюсь. |
Вот вариант, менее чувствительный к формату отображения даты в системе. По крайней мере ггммдд здесь берётся без зависимости от него.
Код:
@Echo Off |
Цитата:
|
Цитата:
|
thx to cooperate )
а реально еще вывести в окно cmd кол-во измененных файлов ? |
Вложений: 1
Еще проблемка, пересохранил в 866 кодировке, все равно не хочет. Путь такой:
"c:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ\210831 ЕВРОПА\210830 Заказы УКРАИНА\" |
папка Bitrix24 - это диск с битрикса
|
megaloman, не могу понять как заставить переходить по этому пути: "C:\Users\%USERNAME%\Documents\Bitrix24\КМ НЗЧ\210831 ЕВРОПА\210830 Заказы УКРАИНА\.."
тут есть кириллица, сохранил в кодировке 866, все равно не видит Может быть связано с тем что папка Bitrix24 это как виртуальный диск ? |
Вложений: 2
реально еще вывести в окно cmd кол-во измененных файлов
Код:
@Echo Off Цитата:
|
megaloman, в тотале путь такой - "c:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ\210831 ЕВРОПА\210830 Заказы УКРАИНА\210622 Заказ.xlsx"
borisov.a - заменим на %USERNAME% как я понимаю и думаю правильней, ну а дальше без изменений, только вылетается еррор - Синтаксическая ошибка в имени файла, имени папки или метке тома. Починил, работает!) Огромаднейшее спасибо! |
megaloman, а такой вопрос, думаю углубится, а реально ли сделать так что бы и папка меняла имя так точно как и файл измененный в ней ? по тому же принципу
|
В идеале все, например структура 3х уровневая
Если структура Dir-> Dir-1-> Dir-2 - и в ней файл, меняем и файл и папки все которые связанные, ведь по сути я ж был в етой папке. Проблем с доступом не будет, т.е. конфликтов с доступом точно как с папками так и с файлами, т.к. это будет делаться в конце рабочего дня. Меняем папку по дате последнего измененного в ней файла, если файлов несколько в папке, но менялся только один, меняем и этот файл и папку целиком Цитата:
|
Вложений: 1
ovrtke,
Если структура Dir-> Dir-1-> Dir-2
Моя тестовая структура (я показываю только папки, верьте мне, если нужно - файлы там переименовываются, не хочу засорять пост)
Код:
Z:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ Код:
@Echo Off |
Затестирую отпишусь)
|
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 внутренних папок например ? |
батник сканирует определенную структуру, как Вы заказывали
Код:
Dir Я не понимаю Вашу проблему. Если файл сегодня изменялся, он будет переименован, будет переименована папка, где он находится, будет переименована папка, в которой находится эта папка. То, что Вы изобразили, не вписывается в этот алгоритм. Никаких ограничений на количество папок DirX и вложенных в них подпапок DirXi нет. Главное, чтобы в папке DirXi хоть один файл был сегодня изменен. Проверил еще раз. |
Хм, странно, чего у меня тогда не переименовывает вниз ?
|
Вложений: 1
Вот что пишет, хотя файл переименован в папке рррр
C:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ\210902 МУЗ-проценщик\210902 test\rrrr\pppp\ меняет только первые две, в папке rrrr - файлов нет, может быть изза етого ? попробовал положить файл в папку rrrr, аналогично, не переименовывает |
ovrtke, Вы запрашивали:
Цитата:
|
а нельзя сделать типа рекурсивный поиск? как например в powershell, или нужно именно задавать глубину поиска ?
|
megaloman, последний вариант, сделать поиск от прописанного пути -> до конечного, либо как реально увеличить глубину поиска ?)
|
ovrtke, Поиск надо делать вверх ногами и рекурсия не нужна. Переименование файлов делается "на раз", с цепочкой папок надо было сообразить.
Поиск в папках произвольной вложенности
Код:
@Echo Off |
megaloman, вы БОГ! Тему можно считать закрытой, +100 в КАРМУ!
|
megaloman, доброго времени суток! Обращусь к вам еще с одной просьбой :)
1) Set "Mask=*.xlsx" - тут можно перечислить расширение не только .xlsx а допустим и .doc ? 2) Pushd "%BoxIn%" ||(Echo Folder "%BoxIn%" not found &Pause &Exit /B 1) - как вывести в окно cmd сканируемую категорию ? Заранее очень благодарен за скорейший ответ :) |
Цитата:
Цитата:
|
Можно задавать список масок файлов
Код:
@Echo Off Еще слегка халтурный вариант
Код:
@Echo Off |
megaloman, Боженька :)
|
Вложений: 2
megaloman, что то не видит совсем файлы (
|
ovrtke, я предполагал такую структуру:
Код:
Папка |
Папка - не трогаем
Папка 1 - переименовываем файлы или есть или нет Папка 1.1 файлы или есть или нет Папка 1.1.1 ..................... примерно так сейчас ? |
ovrtke,
Цитата:
|
Цитата:
|
megaloman, спасибо, чуток допилил, все работает, все огонь!
DJ Mogarych, спасибо за уточнение, но нет, знаю) просто когда есть бета версия одного файла всегда найдутся те которые хотят чучуть дороботать и улучшить, и изменить вводные данные которые были изначально. Но все получилось, еще раз огромаднейшее комраду megaloman за содействие и помощь в оказании написания сего батника |
ovrtke,
Шолом-Алейхем: "Если нельзя, но очень хочется, то можно"
Код:
@Echo Off |
Шолом-Алейхем: "Если нельзя, но очень хочется, то можно"
Круто! Спасибо |
Время: 10:36. |
Время: 10:36.
© OSzone.net 2001-