Войти

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


Мурат09
08-06-2018, 10:47
Здравствуйте. Я только начал изучение данного вопроса а проблема требует немедленного решения. В связи с эти большая просьба помочь.
Необходимо переместить файлы в папки. Файлы находятся в одной папке и имеют наименования состоящие из номера и даты, например ПГ 92 07-59480-17 от 02.11.2017.docx
Папки так же уже созданы и имеют наименование из номера и даты, например 07-59480-17 от 02.11.2017
То есть начало имени файла и папки могут отличаться ну и расширение файла в имени папки не присутствует. Перемещать нужно при полном совпадении номера (**-******-**) и даты ДД.ММ.ГГГГ
Заранее спасибо.

Elven
08-06-2018, 11:28
я так понял файлы в одной папке, а папки с именами "из номера и даты" - в другой, тогда как-то так
@echo off
set files=d:\files
set folders=d:\folders

for /f %%i in ('dir "%folders%" /a:d /b') do (
for /f %%j in ('dir "%files%" /a:-d /b ^| find /i "%%i"') do (
move %files%\%%j %folders%\%%i\
)
)
Разумеется, если имя папки действительно соответствует именам папок таким образом как описано в первом посте.

Мурат09
08-06-2018, 11:39
Спасибо за помощь. Начало имени файла может отличаться, но может и не отличаться, номер и дата всегда совпадают.
Имя папки более предсказуемо выглядит. Только номер и дата.
Выдает ошибку:
Не удается найти указанный файл
Перемещено файлов: 0

Elven
08-06-2018, 12:02
если в именах папок/файлов содержатся кирилические символы - сохранить батник в 866 кодировке (например через NPP (https://notepad-plus-plus.org/download/v7.5.6.html)). Ну и о пробелы традиционно споткнуться можно, настолько их автоматически избегаю, что забываю о том, что они таки имеют место быть, если в именах есть пробелы тогда так:
@echo off
set files=d:\files
set folders=d:\folders

for /f "delims=" %%i in ('dir "%folders%" /a:d /b') do (
for /f "delims=" %%j in ('dir "%files%" /a:-d /b ^| find /i "%%i"') do (
move "%files%\%%j" "%folders%\%%i\"
)
)

Мурат09
08-06-2018, 13:26
Огромное спасибо Elven! Слов нет! Дело которое человек делал бы до самой старости, благодаря Вашим знаниям, делается одним (двойным) нажатием на клавишу мыши. Еще раз спасибо!

Мурат09
13-06-2018, 09:27
Оказалось что помимо файлов с датой (ПГ 92 07-59480-17 от 02.11.2017.docx) есть файлы без даты в названии (КФК 07-59480-17.jpg). Данный скрипт их не перемещает так как ищет совпадение с названием папки. Как выбрать первые 11 символов в названии папки ума не приложу...
Большая просьба помочь.

Мурат09
14-06-2018, 16:32
:( Помогите :(

megaloman
14-06-2018, 20:12
Папки ... уже созданы »@Echo Off
Set "BoxFile=Z:\Box_In"
Set "Folders=Z:\Box_Out\??-?????-?? от ??.??.????"

FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "%Folders%" /A:D /B /O:-D /T:W`) DO Set "Ndir=%%d" &Call :Separ "%Folders%" "%%d"
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "%Folders%" /A:D /B /O:-D /T:W`) DO Set "Ndir=%%d" &Call :Separ "%Folders%" "%%d" %%Ndir:~0,-14%%
GoTo :Eof

:Separ
If "%~3"=="" (
If Exist "%BoxFile%\*%~2.*" >nul 2>&1 Move /Y "%BoxFile%\*%~2.*" "%~dp1%~2\"
) Else (
If Exist "%BoxFile%\*%~3.*" >nul 2>&1 Move /Y "%BoxFile%\*%~3.*" "%~dp1%~2\"
)
GoTo :EofЕсли номер в имени файла/папки уникален, то есть, он в файле/папке за другой день фигурировать не может, то скрипт упрощается. Логика задачи требует именно этого, раз есть файлы с номером и без даты.
@Echo Off
Set "BoxFile=Z:\Box_In"
Set "Folders=Z:\Box_Out\??-?????-?? от ??.??.????"
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir "%Folders%" /A:D /B /O:-D /T:W`) DO Set "Ndir=%%d" &Call :Separ "%Folders%" "%%d" %%Ndir:~0,-14%%
GoTo :Eof

:Separ
If Exist "%BoxFile%\*%~3*.*" >nul 2>&1 Move /Y "%BoxFile%\*%~3*.*" "%~dp1%~2\"
GoTo :Eof

Мурат09
18-06-2018, 15:12
Ошибку выдает:

d:\>5.bat

d:\>я╗┐@echo off
"я╗┐@echo" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

d:\>Set "BoxFile=D:\files"

d:\>Set "Folders=D:\folders\??-?????-?? ╨╛╤В ??.??.????"

d:\>FOR /F "usebackq delims=" %d IN (`2>nul Dir "D:\folders\??-?????-?? ╨╛╤В ??.
??.????" /A:D /B /O:-D /T:W`) DO Set "Ndir=%d" & Call :Separ "D:\folders\??-??
???-?? ╨╛╤В ??.??.????" "%d"

d:\>FOR /F "usebackq delims=" %d IN (`2>nul Dir "D:\folders\??-?????-?? ╨╛╤В ??.
??.????" /A:D /B /O:-D /T:W`) DO Set "Ndir=%d" & Call :Separ "D:\folders\??-??
???-?? ╨╛╤В ??.??.????" "%d" %Ndir:~0,-14%

d:\>GoTo :Eof

Iska
18-06-2018, 15:19
Ошибку выдает: »
См. выше:
сохранить батник в 866 кодировке (например через NPP). »
Но никак не в UTF-8 с BOM.

Мурат09
18-06-2018, 15:30
А ведь я изначально так и сделал. Но NPP изменение кодировки не сохранил пока не сохранил в новый файл. Всё заработало. Огромное спасибо!!!!!!!!!!!

Iska
18-06-2018, 15:53
Потому я лично предпочитаю редактор Far Manager'а.

Мурат09
18-06-2018, 16:56
Спасибо! Сегодня уже успел хорошо по-мучиться с кодировками в NPP. Перейду на Far Manager.

Iska
18-06-2018, 17:13
Мурат09, на будущее ещё порекомендую вот этот плагин для работы с исходниками: [ESC] Editor's settings changer (https://plugring.farmanager.com/plugin.php?pid=364).

Мурат09
27-06-2018, 09:57
Iska, спасибо. Прямо сейчас загружу и начну пользоваться так как снова столкнулся с проблемами с кодировкой при работе с NPP.




© OSzone.net 2001-2012