Войти

Показать полную графическую версию : Поиск и переименование файлов с помощью BATника


Страниц : 1 [2] 3

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

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

megaloman
01-09-2021, 15:05
@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Может быть связано с тем что папка Bitrix24 это как виртуальный диск »Я не могу воспроизвести такую ситуацию, я формально создал папку на своём диске Z:, Вы поставьте нужный. А в тотал-коммандере, например, по какому пути Вы можете видеть эту папку?

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

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

ovrtke
01-09-2021, 16:43
megaloman, а такой вопрос, думаю углубится, а реально ли сделать так что бы и папка меняла имя так точно как и файл измененный в ней ? по тому же принципу

ovrtke
01-09-2021, 17:44
В идеале все, например структура 3х уровневая

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

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

megaloman
01-09-2021, 21:31
ovrtke, Моя тестовая структура (я показываю только папки, верьте мне, если нужно - файлы там переименовываются, не хочу засорять пост) 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
Затестирую отпишусь)

ovrtke
02-09-2021, 13:24
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
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
Хм, странно, чего у меня тогда не переименовывает вниз ?

ovrtke
02-09-2021, 15:24
Вот что пишет, хотя файл переименован в папке рррр

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

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

ovrtke
02-09-2021, 16:07
а нельзя сделать типа рекурсивный поиск? как например в powershell, или нужно именно задавать глубину поиска ?

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

megaloman
03-09-2021, 13:23
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
megaloman, вы БОГ! Тему можно считать закрытой, +100 в КАРМУ!

ovrtke
15-09-2021, 13:02
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
Эти файлы рассматриваются независимо, то есть берём самый свежий *.xlsx и .doc? »
да, тот же принцип что и с .xlsx, т.е. берем самый свежий .xls, .doc

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

megaloman
15-09-2021, 17:23
@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
megaloman, Боженька :)




© OSzone.net 2001-2012