Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Перемещение файлов из одной папки в разные в зависимости от имени файла

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

Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 09:40, 19-09-2011

 

Старожил


Сообщения: 175
Благодарности: 119

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@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
)

Последний раз редактировалось SendMessage, 19-09-2011 в 14:22. Причина: добавлен скрипт

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:01, 19-09-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Ветеран


Contributor


Сообщения: 2709
Благодарности: 1685

Профиль | Отправить PM | Цитировать


Я понял задачу чуть иначе: в файлах 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
позволяют проконтролировать длину имени и добиться от батника ожидаемого результата.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 19-09-2011 в 17:04.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:57, 19-09-2011 | #3


Старожил


Сообщения: 175
Благодарности: 119

Профиль | Отправить PM | Цитировать


megaloman, мне думается, проще всего так:
Код: Выделить весь код
FOR /f "delims=" %%f IN ('Dir /b /A:-D "%Folder1%" ^| findstr "^.........\....$"') DO
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:49, 19-09-2011 | #4


Новый участник


Сообщения: 4
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Я понял задачу чуть иначе: »
Да, вы правильно поняли, спасибо (остальным ответившим тоже гран мерси)!

Отправлено: 04:20, 20-09-2011 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Перемещение файлов из одной папки в разные в зависимости от имени файла

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Добавление к имени файла имя папки Arsenik77 Скриптовые языки администрирования Windows 12 13-08-2011 20:28
VBS/WSH/JS - Перемещение файлов и папок в разные папки... WalkManX Скриптовые языки администрирования Windows 0 07-08-2011 22:37
CMD/BAT - [решено] Копирование имени папки/файла в буфер обмена cpp.svet Скриптовые языки администрирования Windows 3 06-07-2011 19:16
CMD/BAT - [решено] Перемещение устаревших файлов из папки в резервную папку zavoruev Скриптовые языки администрирования Windows 22 28-05-2010 14:04
Ошибка - Каракули в реестре "Синтаксическая ошибка в имени файла,имени папки или метке тома" permas Microsoft Windows 2000/XP 2 20-02-2010 19:30




 
Переход