|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку |
|
|
CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку
|
Новый участник Сообщения: 9 |
Профиль | Отправить PM | Цитировать Уважаемые, прошу помощи по такому вопросу:
Имеем многоуровневую развитую структуру директорий "Главная-подчиненные". Например, GENERALFOLDER |_FOLDER-1 |_FOLDER-11 |_FOLDER-111 |_FOLDER-1111 |_FOLDER-1112 ... |_FOLDER-112 ... |_FOLDER-2 ... и т.д. Количество подчиненных директорий не фиксировано. Есть ли способ написать батник, который бы перемещал все файлы поддиректорий в их корневую папку? То есть, все файлы из любых поддиректорий папки FOLDER-1 перемещались бы в FOLDER-1, все файлы поддиректорий из FOLDER-2 перемещались бы в FOLDER-2, так же с FOLDER-3 и т.д. При этом, необходимо избежать переписывания файлов при совпадений их имен, а оригинальными именами файлов можно жертвовать, но не расширениями. |
|
Отправлено: 17:01, 23-02-2009 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать можно, но из схемы не видна вложенность подкаталогов, к примеру, является ли FOLDER-11 подкаталогом FOLDER-1 ?.. Наконец, недостаточно полно описан алгоритм разрешения конфликтов имен, что значит "именами файлов можно жертвовать, но не расширениями"? переименовывать при совпадении?.. но тогда по какому правилу?.. или затирать?.. но тогда какой из двух файлов?
пример для одного исходного каталога, оставляющий конфликтующие файлы без изменений: @Echo Off Set $SRC=C:\GENERALFOLDER\FOLDER-1\*.* Set $DST=C:\GENERALFOLDER\FOLDER-1\ If Not Exist %$DST% MD %$DST% 2>Nul If Not Exist %$DST% ( @Echo Ошибка! Целевой каталог не обнаружен. Exit ) For /F "Delims=" %%i In ('DIR /B/S/A:-D "%$SRC%"') Do ( If Not Exist "%$DST%%%~nxi" Move "%%i" "%$DST%" ) |
Отправлено: 08:59, 24-02-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 9
|
Профиль | Отправить PM | Цитировать amel27
Спасибо за ответ. Да, имелось ввиду, что FOLDER 111 - это подкаталог папки FOLDER-11, которая в свою очередь является подкаталогом папки FOLDER-1. А в отношении жертвоприношений имен файлов имелась ввиду допустимость изменять их как угодно в целях сохранения самого файла - переименовывать по любому правилу при совпадении (полное переименование, добавление символа, цифры, и т.д., но с сохранением расширения). Сегодня опробую Ваш код на живом материале, благодарю. |
Отправлено: 10:45, 24-02-2009 | #3 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Цитата rBBWYwg:
@Echo Off Set MASK=*.* Set ROOT=C:\GENERALFOLDER For /F "Delims=" %%a In ('2^>nul DIR /B/S/A:D %ROOT%\*') Do ( For /F "Delims=" %%i In ('2^>nul DIR /B/S/A:-D "%%a\%MASK%"') Do ( Call :FileGetNewName "%%i" "%ROOT%" Call :FileMove "%%i" ) ) Exit :FileMove :: --- :: %1 - полное имя исходного файла, включая путь :: --- Echo From: %~1 Echo To : %$N%%$I%%$X% Echo. Move "%~1" "%FileGetNewName%" >Nul GoTo :EOF :FileGetNewName :: --- :: %1 - полное имя исходного файла, включая путь :: %2 - путь к целевому каталогу :: --- Set $I= Set FileGetNewName= If Not Exist "%~1" GoTo :EOF For %%i In ("%~1") Do Set $N=%%~ni For %%i In ("%~1") Do Set $X=%%~xi :FileGetNewName_LOOP Set FileGetNewName=%~2\%$N%%$I%%$X% If Not Exist "%FileGetNewName%" GoTo :EOF Set /A $I +=1 GoTo FileGetNewName_LOOP |
|
Отправлено: 11:46, 24-02-2009 | #4 |
Новый участник Сообщения: 9
|
Профиль | Отправить PM | Цитировать amel27,
большое спасибо за помощь. Но оказалось, что CMD крайне долго обрабатывает мой объем файлов (порядка 10 тысяч), при этом делая много ошибок - пропускает некоторые папки, не добираясь до файлов. Вероятно, существуют какие-то количественные ограничения. К тому же, некоторые файлы просто не воспринимаются самой консолью из-за неудобоваримых имен. Поэтому я нашла способ формировать батник ПРЯМОГО поименного копирования с указанием пути от каждого файла в корневую папку. В работе сэкономила массу времени и избежала ошибок. НО!!! Не избежала потери информации, когда имена файлов из разных папок совпадают. Они просто замещают уже имеющийся. Прошу помочь снова. Можно ли каким-то образом, используя прямые пути копирования файлов из субдиректорий в директории вида copy /y /n "C:\FOLDER\SUBFOLDER\*.*" "C:\FOLDER\" сформировать дополнительное условие дополнения имен счетчиком, если в целевой директории лежит файл с тем же именем? |
|
Отправлено: 16:30, 16-03-2009 | #5 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Цитата rBBWYwg:
Цитата rBBWYwg:
Цитата rBBWYwg:
Цитата rBBWYwg:
For %%i In ("C:\FOLDER\SUBFOLDER\*.*") Do ( Call :FileGetNewName "%%i" "C:\FOLDER" Call :FileCopy "%%i" ) Exit :FileCopy Copy "%~1" "%FileGetNewName%" >Nul GoTo :EOF :FileGetNewName Set $I= Set FileGetNewName= If Not Exist "%~1" GoTo :EOF For %%i In ("%~1") Do Set $N=%%~ni&$X=%%~xi :FileGetNewName_LOOP Set FileGetNewName=%~2\%$N%%$I%%$X% If Not Exist "%FileGetNewName%" GoTo :EOF Set /A $I +=1 GoTo FileGetNewName_LOOP |
||||
Отправлено: 08:58, 17-03-2009 | #6 |
Новый участник Сообщения: 9
|
Профиль | Отправить PM | Цитировать amel27,
Поняла, спасибо. На счет ограничений и тормозящего эффекта Echo для меня информация совершенно новая. Проверила через Excel - действительно, некоторые пути+файлы больше 255 знаков. Эффект от Echo не замеряла. Посмотрите, пожалуйста, личку - отправлю вопрос, на который прошу ответить так же в личку. |
Отправлено: 12:13, 17-03-2009 | #7 |
Пользователь Сообщения: 72
|
Профиль | Отправить PM | Цитировать Можете подправить этот батник так,
Цитата amel27:
GENERALFOLDER |_FOLDER-1 |_FOLDER-11 |_FOLDER-111 |_FOLDER-1111 |_FOLDER-1112 чтоб все файлы из поддиректорий |_FOLDER-1112 |_FOLDER-1111 |_FOLDER-111 |_FOLDER-11 переместились в |_FOLDER-1 при этом если в |_FOLDER-1 нет поддиректорий, то ее не надо трогать т.е. перемещать файлы из нее в GENERALFOLDER. |
|
Последний раз редактировалось Arsenik77, 13-08-2011 в 20:31. Отправлено: 20:23, 05-08-2011 | #8 |
Ветеран Сообщения: 1758
|
Arsenik77, Как-то так
@echo off setlocal for /d %%i in ("generalfolder\*") do ( pushd "%%i" for /d %%j in (*) do ( for /f "tokens=*" %%k in (' "2>nul dir /b /s /a-d "%%j"" ') do call:move "%%k" ) popd ) goto:eof :move set "file=%~nx1" :check set /a cnt+=1 if exist "%file%" set "file=%~n1(%cnt%)%~x1" && goto:check move %1 "%file%" set "cnt=" set "file=" |
Отправлено: 21:21, 13-08-2011 | #9 |
Пользователь Сообщения: 72
|
Профиль | Отправить PM | Цитировать Цитата Foreigner:
Нужно чтобы в директориях оставались только определенные файлы. |
|
Отправлено: 22:17, 17-08-2011 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Записать имя папки в которой лежит батник в переменную а потом эту же папку переим. | bobr95 | Скриптовые языки администрирования Windows | 8 | 10-04-2012 18:42 | |
Доступ - сетевое обнаружение и вход в общую папку | фрай_луис | Microsoft Windows Vista | 4 | 27-12-2009 19:54 | |
CMD/BAT - [решено] Как получить права на папку\файл в Windows Seven через батник? | Pozia | Скриптовые языки администрирования Windows | 7 | 08-12-2009 21:47 | |
V. 5.5/2000/2003 - Переместить содержимое почтового ящика в общую папку | migunov | Microsoft Exchange Server | 2 | 25-02-2009 19:02 | |
Копирование исходящей почты в Общую папку | Loki3D | Microsoft Exchange Server | 0 | 01-10-2007 18:11 |
|