Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Поиск и переименование файлов с помощью BATника (http://forum.oszone.net/showthread.php?t=349509)

ovrtke 31-08-2021 15:36 2965489

Поиск и переименование файлов с помощью 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 /?

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

DJ Mogarych 31-08-2021 18:37 2965507

1. А зачем все эти переименования файлов, если дату изменения файла легко вывести и так, и произвести необходимые манипуляции? Какая конечная цель этого переименования?
2. Чем геморроиться с батниками, осваивайте Powershell, где работать с метками файлов на порядок проще.

Например, вывести имена файлов и даты изменения и отсортировать по дате изменения:
Код:

dir "C:\Windows" |select name,LastWriteTime |sort lastwritetime

Name                              LastWriteTime     
----                              -------------     
IsUn0419.exe                      07.10.1998 18:14:18
IsUninst.exe                      29.10.1998 16:45:06
WLXPGSS.SCR                      31.03.2014 22:34:22
system.ini                        10.07.2015 14:02:40
CSC                              08.02.2016 10:38:14
eReg.dat                          07.03.2016 20:31:28
DirectX.log                      20.03.2016 10:14:34
popcinfo.dat                      19.03.2017 9:24:05
UpdateAssistantV2                14.06.2017 22:12:14
VPNInstall.MIF                    06.04.2018 19:25:42
DDACLSys.log                      04.05.2018 0:49:16
pyw.exe                          20.10.2018 14:06:16
py.exe                            20.10.2018 14:06:16
pyshellext.amd64.dll              20.10.2018 14:08:32
InfusedApps                      23.12.2018 22:57:15
VPNUnInstall.MIF                  27.12.2018 20:39:56
RtlExUpd.dll                      15.04.2019 5:13:56
progress.ini                      06.12.2019 19:10:36
write.exe                        07.12.2019 0:29:00
и т. д.


megaloman 31-08-2021 20:10 2965515

Код:

@Echo Off
cls
        Set "BoxIn=Z:\Box_In"
        Set "Mask=*.xlsx"
        Set "DateMask=^[2-9][0-9][0-1][0-9][0-3][0-9] .*"

        Set "MyDate=%Date:~-2%%Date:~3,2%%Date:~0,2% "

        Pushd "%BoxIn%" ||(Echo Filder "%BoxIn%" not found &Pause &Exit /B 1)
        For /F "usebackq delims=" %%f In (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D /O:-D /T:W`) Do (
                Set "Name=%%f"
                Set "Dfile=%%~tf"
                Call Set "Dfile=%%Dfile:~0,10%%"
                Call Echo %%Name%%| >nul 2>&1 FindStr /I /X /R /C:"%DateMask%" &&Call Set "Name=%%Name:~7%%"
                Call :MyReName "%%f" "%%Name%%" "%Date%" "%%Dfile%%" "%MyDate%" ||(Popd &Exit /B 0)
        )
        Popd
pause
Exit /B 0

:MyReName
        If %3==%4 (Ren %1 "%~5%~2") Else (Exit /B 1)
Exit /B 0

Предполагается, что формат даты в системе имеет вид дд.мм.гггг
Иначе понадобятся небольшие корректировки.

ovrtke 01-09-2021 09:53 2965546

Цитата:

Цитата DJ Mogarych
к »

Дело в том, что есть необходимость переименовывать файлы которые изменялись текущей датой, это понятно что можно и тоталом смотреть измененные, но ручками не хочется сохранять в формат - 210901 тест.xlsx, а хочется просто сохранить test.xlsx запустить батник и он сам переименует этот файлик (и кучу других) в формат 210901 test.xlsx

Цитата:

Цитата megaloman
Предполагается, что формат даты в системе имеет вид дд.мм.гггг
Иначе понадобятся небольшие корректировки »

А реально переделать в формат даты - 21 (год) 09 ( месяц) 01 (день) пробел тест.xlsx, выглядить должен так - 210901 test.xlsx

Еще ньюанс, если файл уже был изменен например вчера и имеет имя - 210831 тест.xlsx, я его открываю сегодня, т.е. 01.09, сохраняю и запускаю батник, он должен находить имена файлов которые начинаются на 21**** и заменять эти символы на текущую дату, дата использования батника будет с 01.09, т.е. потенциально файлы все будут начинаться на 21(м)(д) имя.расширение

DJ Mogarych 01-09-2021 09:57 2965548

Цитата:

Цитата ovrtke
необходимость переименовывать файлы которые изменялись текущей датой »

Вот и вопрос - что это за необходимость такая. Для чего переименовывать, если метку даты и так можно извлечь из соответствующего поля?

megaloman 01-09-2021 10:06 2965549

ovrtke, речь идет о формате даты в системе. То есть, как отображается дата в командах
Echo %date%
Dir.
Результат батника - "ггммдд имяфайла.xlsx"
где ггммдд сформирован из сегодняшней даты.
Пробуйте, спрашивайте.

ovrtke 01-09-2021 10:11 2965550

Вложений: 1
Цитата:

Цитата megaloman
Предполагается, что формат даты в системе имеет вид дд.мм.гггг
Иначе понадобятся небольшие корректировки. »

Такой вот error, и не нашел где прописать путь сканирования файлов ?

ovrtke 01-09-2021 10:14 2965551

Вложений: 1
Цитата:

Цитата DJ Mogarych
Вот и вопрос - что это за необходимость такая. Для чего переименовывать, если метку даты и так можно извлечь из соответствующего поля? »

Нужно мониторить кто что изменял

ovrtke 01-09-2021 10:39 2965555

Придумал как сделать, только нужен небольшой upgrade. Нужно дописать если файл содержит вначале "21**** имя.xlsx" - удалять первые 6 символов и заменять на текущую дату. Проверил, батник переименовывает датой когда последняя дата изменения файла была, если ты открываешь документ - чего то меняешь и сохраняешь и запускаешь батник он переименовывает вот так: - 210901 210831 test.txt - т.е. вчерашнюю дату не изменяет и не удаляет а добавляет новую. Если имя файла было тест.xlsx и изменение было 210808 то батник переименовывает его как 210808 тест.xlsx. Помогите сделать апргрейд кода ))

У меня мысли крутятся, что нужно добавить: выделить подстроку с помощью set и запихнуть в if и прописать условие поиске, если 21**** тест.xlsx то удаляем первые 6 символов и заменяем их на текущие, как это сделать не пойму

Код:

@echo off
SetLocal EnableDelayedExpansion
set "workdir=c:\temp"
for /f "tokens=* delims=" %%a in ('dir /tc /o:-d /a:a /b "%workdir%" 2^>nul') do (
    for /f "tokens=* delims=" %%b in ("%workdir%\%%a") do set "d=%%~tb"
    set "d1=!d:~8,2!!d:~3,2!!d:~0,2!"
    echo %workdir%\%%a !d1!
    ren "%workdir%\%%a" "!d1! %%a"
    attrib -A "%workdir%\!d1! %%a"
)
pause


DJ Mogarych 01-09-2021 10:41 2965556

ОК, а как вы поймёте, кто изменял?

ovrtke 01-09-2021 10:52 2965557

Цитата:

Цитата DJ Mogarych
ОК, а как вы поймёте, кто изменял? »

Это не нужно знать кто, щас попытаюсь обьяснить

Есть общая папка, в которой работают 3-4 человека, в день открывается/добавляется/изменяется от 30-50 файлов, и сохранять ручками с текущей датой все то что ты открыл/изменил/сохранил не хочется, просто нужно запустить батник, он все изменит (все что ты сохранил/изменил/добавил) на текущую дату и все. В этой общей папке видно кто под каким паролем их сохранял/изменял, нам по большому счету не нужно, нужно лишь изменять на текущую дату изменения и все

мне осталось допилить что бы, если файл имеет имя уже с текущей датой, либо старой, и заново не прописывалась дата, а удалялась старая и ставилась новая, и побольшому счету проблема решена :)

DJ Mogarych 01-09-2021 10:56 2965560

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

ovrtke 01-09-2021 11:07 2965561

Цитата:

Цитата DJ Mogarych
Всё равно непонятно, зачем переименовывать. »

ну вот нужно) такая цель...и нужно побольшому счету просто добавить 2 строчки в код, что то пробую пробую но видимо не хватает знаний в cmd...((

megaloman 01-09-2021 11:13 2965562

ovrtke,
Цитата:

Цитата ovrtke
Такой вот error, и не нашел где прописать путь сканирования файлов ? »

Я считал, что это очевидно. У меня
Код:

Set "BoxIn=Z:\Box_In"
Вы напИшите свой путь. Единственное, если в пути кириллица, сохраните батник в 866 кодировке.
Я делаю тупо и дубОво: я анализирую сегодняшнюю дату (%Date%) c датой/временем модификации файла из Dir (%%~tf), усеченной до даты. Выделяю имя файла: если оно без даты "ггммдд " впереди, то беру его как есть "имябездаты", а если впереди дата, её из имени отбрасываю, получаю "имябездаты"и переименовываю файл с исходным именем в "ггммдд имябездаты" и не завихряюсь.

megaloman 01-09-2021 11:36 2965563

Вот вариант, менее чувствительный к формату отображения даты в системе. По крайней мере ггммдд здесь берётся без зависимости от него.
Код:

@Echo Off
cls
        Set "BoxIn=Z:\Box_In"
        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)

        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%%"
                               
                        ) Else (
                                GoTo :Continue
                        )
                )
        )
        :Continue
        Popd
pause
Exit /B 0


ovrtke 01-09-2021 11:37 2965564

Цитата:

Цитата megaloman
megaloman »

Заработало, спасибо, попытаюсь доработать,а мой код который выше реально дописать ?

megaloman 01-09-2021 11:40 2965565

Цитата:

Цитата ovrtke
,а мой код который выше реально дописать »

Я писатель, а не читатель :) , возможно кому-то захочется.

ovrtke 01-09-2021 11:44 2965567

thx to cooperate )

а реально еще вывести в окно cmd кол-во измененных файлов ?

ovrtke 01-09-2021 12:08 2965570

Вложений: 1
Еще проблемка, пересохранил в 866 кодировке, все равно не хочет. Путь такой:
"c:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ\210831 ЕВРОПА\210830 Заказы УКРАИНА\"

ovrtke 01-09-2021 12:09 2965571

папка Bitrix24 - это диск с битрикса

ovrtke 01-09-2021 14:26 2965578

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

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

megaloman 01-09-2021 15:05 2965580

Вложений: 2
реально еще вывести в окно 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:, Вы поставьте нужный. А в тотал-коммандере, например, по какому пути Вы можете видеть эту папку?

ovrtke 01-09-2021 15:09 2965581

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

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

ovrtke 01-09-2021 16:43 2965586

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

ovrtke 01-09-2021 17:44 2965589

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

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

Цитата:

Цитата megaloman
....\210831 ЕВРОПА\210830 Заказы ....\ »

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

megaloman 01-09-2021 21:31 2965602

Вложений: 1
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


ovrtke 02-09-2021 08:45 2965625

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

ovrtke 02-09-2021 13:24 2965662

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 внутренних папок например ?

megaloman 02-09-2021 15:00 2965673

батник сканирует определенную структуру, как Вы заказывали
Код:

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 хоть один файл был сегодня изменен. Проверил еще раз.

ovrtke 02-09-2021 15:12 2965674

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

ovrtke 02-09-2021 15:24 2965676

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

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

megaloman 02-09-2021 15:43 2965677

ovrtke, Вы запрашивали:
Цитата:

Цитата ovrtke
В идеале все, например структура 3х уровневая
Если структура Dir-> Dir-1-> Dir-2 »

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

ovrtke 02-09-2021 16:07 2965679

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

ovrtke 03-09-2021 09:20 2965743

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

megaloman 03-09-2021 13:23 2965759

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


ovrtke 03-09-2021 15:12 2965764

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

ovrtke 15-09-2021 13:02 2966687

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

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

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

ovrtke 15-09-2021 16:07 2966702

Цитата:

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

да, тот же принцип что и с .xlsx, т.е. берем самый свежий .xls, .doc

Цитата:

Цитата megaloman
В смысле, что Вы хотите видеть? Каждую подпапку, которая обрабатывается? »

просто вывести путь который указываем в BoxIn=Z:\Users\borisov.a\Documents\Bitrix24\КМ НЗЧ

megaloman 15-09-2021 17:23 2966705

Можно задавать список масок файлов
Код:

@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


ovrtke 15-09-2021 17:39 2966708

megaloman, Боженька :)

ovrtke 16-09-2021 08:37 2966742

Вложений: 2
megaloman, что то не видит совсем файлы (

megaloman 16-09-2021 08:59 2966744

ovrtke, я предполагал такую структуру:
Код:

Папка
    Папка 1
          файлы или есть или нет
          Папка 1.1
                  файлы или есть или нет
                  Папка 1.1.1
                  ..................... 
      Папка 2
          файлы или есть или нет
          Папка 2.1
                  файлы или есть или нет
                  Папка 2.1.1
                    ......

Переименование корневой папки и обработка файлов в ней не предполагалось. В корневой Папке должны быть подпапки.

ovrtke 16-09-2021 09:09 2966745

Папка - не трогаем
Папка 1 - переименовываем
файлы или есть или нет
Папка 1.1
файлы или есть или нет
Папка 1.1.1
.....................
примерно так сейчас ?

megaloman 16-09-2021 09:31 2966750

ovrtke,
Цитата:

Цитата ovrtke
а если так ? »

Можно, но нельзя :). Я не знаю, зачем Вам скрипт. Но у Вас имя корневой папки прописано в батнике. И, если оно изменится после обработки, то при следующем запуске батника она найдена не будет, или ручками придётся ее перепрописать в коде - полный угар.

DJ Mogarych 16-09-2021 09:56 2966751

Цитата:

Цитата megaloman
Я не знаю, зачем Вам скрипт. »

Автор темы, по всей видимости, тоже.

ovrtke 16-09-2021 10:16 2966757

megaloman, спасибо, чуток допилил, все работает, все огонь!
DJ Mogarych, спасибо за уточнение, но нет, знаю) просто когда есть бета версия одного файла всегда найдутся те которые хотят чучуть дороботать и улучшить, и изменить вводные данные которые были изначально. Но все получилось, еще раз огромаднейшее комраду megaloman за содействие и помощь в оказании написания сего батника

megaloman 16-09-2021 11:08 2966767

ovrtke,
Шолом-Алейхем: "Если нельзя, но очень хочется, то можно"
Код:

@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"
        )
        Call :ReFiles "%BoxIn%" "%Mask%" "Ni"
        Popd

        Echo === Changed %NTotal% files today. Folder="%BoxIn%" Mask=%Mask%
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

Файлы в корневой папке переименовывываются, а сама папка нет. Добавил всего одну строку. Элементарно сделать , чтобы и папка переименовывалась, но это уже обсудили.

ovrtke 16-09-2021 12:20 2966780

Шолом-Алейхем: "Если нельзя, но очень хочется, то можно"

Круто! Спасибо


Время: 16:38.

Время: 16:38.
© OSzone.net 2001-