CMD/BAT - [решено] Перемещение файлов из одной папки в разные в зависимости от имени файла

Ответить
Аватара пользователя
Sarge81

CMD/BAT - [решено] Перемещение файлов из одной папки в разные в зависимости от имени файла

Сообщение Sarge81 »

Здравствуйте!



Есть набор файлов с именами вида abcdXXXef.ext в папке C:\Folder1. Требуется переместить их в соответствующие подпапки с именами XXX (т.е. с тем же названием), находящиеся в папке C:\Folder2. Например, файл C:\Folder1\abcd123ef.ext надо переместить в папку C:\Folder2\123, файл C:\Folder1\abcd456ef.ext в папку C:\Folder2\456 и т.д.
Аватара пользователя
Sarge81

Re: CMD/BAT - [решено] Перемещение файлов из одной папки в разные в зависимости от имени файла

Сообщение Sarge81 »

Код:

Код: Выделить всё

@echo off
setlocal enabledelayedexpansion
set "dir1=C:\Folder1"
set "dir2=C:\Folder2"
set "ext=*.ext"
pushd "%dir1%" && (
   for %%a in (%ext%) do (
      set "fn=%%a"
      md "%dir2%\!fn:~4,3!" 2>nul
      move "%%a" "%dir2%\!fn:~4,3!\"
   )
   popd
)

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


читать дальше »




Код:

Код: Выделить всё

@echo off
setlocal enabledelayedexpansion
set "dir1=c:\Folder1"
set "dir2=c:\Folder2"
set "ext=ext"
pushd "%dir1%" && (
   for %%a in (abcd???ef.%ext%) do (
      set "fn=%%a"
      md "%dir2%\!fn:~4,3!" 2>nul
      move "%%a" "%dir2%\!fn:~4,3!\"
   )
   popd
)
Аватара пользователя
megaloman

Re: CMD/BAT - [решено] Перемещение файлов из одной папки в разные в зависимости от имени файла

Сообщение megaloman »

Я понял задачу чуть иначе: в файлах 9 произвольных символов в имени, три в расширении. Надо их переместить в папки с именами, совпадающими с тремя (4+5+6) символами в имени файла. Решение двумя способами я привожу (один способ отличается от другого только организацией цикла по именам файлов). Ничего нового по сравнению с предыдущим ответом тут нет, но, однако, при этом я в очередной раз наткнулся на не совсем предсказуемую работу команд. У меня был набор следующих файлов в первой директории:

aaa

abcd001ef.ext

abcd001ef1.ext

abcd001eg.ext

abcd002ef.ext

abcd002ef2.ext

abcd002eg.ext

bbb

dddd

В обоих кодах я оставил для отладки строку

Echo %1

которую в рабочем режиме можно удалить.

Я предполагал, что маска ?????????.??? гарантирует мне выборку файлов с именами в 9 символов. Увы, в обоих способах команда Echo %1 отображает все файлы из приведенного мной списка, хотя там в именах файлов встречается и 10 символов, и три, и четыре.



Код:

Код: Выделить всё

Echo Off
Set Folder1=D:\Delete\Folder1
Set Folder2=D:\Delete\Folder2
FOR %%f IN ("%Folder1%\?????????.???") DO Call :MoveXXX "%%f"
GoTo :Eof
:MoveXXX
Echo %1
Set DirName=%~n1
Set DDD=%DirName%x
If Not %DDD:~0,9%==%DirName% GoTo :Eof
Set DirName=%DirName:~4,3%
If Not Exist "%Folder1%\????%DirName%??.???" GoTo :Eof
If Not Exist "%Folder2%\%DirName%" Md "%Folder2%\%DirName%" 
Move /Y "%Folder1%\????%DirName%??.???" "%Folder2%\%DirName%\" >NUL

Второй способ
читать дальше »




Код:

Код: Выделить всё

Echo Off
Set Folder1=D:\Delete\Folder1
Set Folder2=D:\Delete\Folder2
FOR /F "usebackq delims=" %%f IN (`Dir /b /A:-D "%Folder1%\?????????.???"`) DO Call :MoveXXX "%%f"
GoTo :Eof
:MoveXXX
....... 
Далее то же, что и в предыдущем случае.



Команда Dir в командном окне с приведённой маской выдаёт такой же неверный результат.



Строки кода

Set DDD=%DirName%x

If Not %DDD:~0,9%==%DirName% GoTo :Eof

позволяют проконтролировать длину имени и добиться от батника ожидаемого результата.
Аватара пользователя
SendMessage

Re: CMD/BAT - [решено] Перемещение файлов из одной папки в разные в зависимости от имени файла

Сообщение SendMessage »

megaloman, мне думается, проще всего так:



Код:

Код: Выделить всё

FOR /f "delims=" %%f IN ('Dir /b /A:-D "%Folder1%" ^| findstr "^.........\....$"') DO
Ответить

Вернуться в «Скриптовые языки администрирования Windows»