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

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

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

Аватара для rBBWYwg

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


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

Профиль | Отправить 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
Благодарности: 1563

Профиль | Отправить 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%"
)
еще один пример: http://forum.oszone.net/showthread.p...297#post922297
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:59, 24-02-2009 | #2



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

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


Аватара для rBBWYwg

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


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

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


amel27
Спасибо за ответ.
Да, имелось ввиду, что FOLDER 111 - это подкаталог папки FOLDER-11, которая в свою очередь является подкаталогом папки FOLDER-1. А в отношении жертвоприношений имен файлов имелась ввиду допустимость изменять их как угодно в целях сохранения самого файла - переименовывать по любому правилу при совпадении (полное переименование, добавление символа, цифры, и т.д., но с сохранением расширения).
Сегодня опробую Ваш код на живом материале, благодарю.

Отправлено: 10:45, 24-02-2009 | #3


Googler


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

Профиль | Отправить 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

-------
Как сообщить о том, что моя проблема решена?
не оказываю техподдержку через ПМ/ICQ/Mail - для этого есть форум

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

Отправлено: 11:46, 24-02-2009 | #4


Аватара для rBBWYwg

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


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

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


amel27,
большое спасибо за помощь. Но оказалось, что CMD крайне долго обрабатывает мой объем файлов (порядка 10 тысяч), при этом делая много ошибок - пропускает некоторые папки, не добираясь до файлов. Вероятно, существуют какие-то количественные ограничения. К тому же, некоторые файлы просто не воспринимаются самой консолью из-за неудобоваримых имен. Поэтому я нашла способ формировать батник ПРЯМОГО поименного копирования с указанием пути от каждого файла в корневую папку. В работе сэкономила массу времени и избежала ошибок.
НО!!!
Не избежала потери информации, когда имена файлов из разных папок совпадают. Они просто замещают уже имеющийся.

Прошу помочь снова. Можно ли каким-то образом, используя прямые пути копирования файлов из субдиректорий в директории вида
copy /y /n "C:\FOLDER\SUBFOLDER\*.*" "C:\FOLDER\"
сформировать дополнительное условие дополнения имен счетчиком, если в целевой директории лежит файл с тем же именем?

Отправлено: 16:30, 16-03-2009 | #5


Googler


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

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


Цитата rBBWYwg:
CMD крайне долго обрабатывает мой объем файлов »
команды Echo из скрипта пробовали убирать?

Цитата rBBWYwg:
пропускает некоторые папки, не добираясь до файлов. Вероятно, существуют какие-то количественные ограничения »
надо конкретно смотреть, мне известно только ограничение на длину имени файла+путь до 255 символов

Цитата rBBWYwg:
copy /y /n "C:\FOLDER\SUBFOLDER\*.*" "C:\FOLDER\" »
но это не "батник ПРЯМОГО поименного копирования с указанием пути от каждого файла", а копирование содержимого каталога по маске

Цитата rBBWYwg:
дополнительное условие дополнения имен счетчиком, если в целевой директории лежит файл с тем же именем »
средствами COPY никак, могу только привести кусок из приведенного выше скрипта:
Код: Выделить весь код
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


Аватара для rBBWYwg

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


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

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


amel27,
Поняла, спасибо.
На счет ограничений и тормозящего эффекта Echo для меня информация совершенно новая. Проверила через Excel - действительно, некоторые пути+файлы больше 255 знаков. Эффект от Echo не замеряла.
Посмотрите, пожалуйста, личку - отправлю вопрос, на который прошу ответить так же в личку.

Отправлено: 12:13, 17-03-2009 | #7


Пользователь


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

Профиль | Отправить 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


Ветеран


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

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


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
Благодарности: 1

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


Цитата Foreigner:
Как-то так »
Помоги прикрутить к твоему батнику вот этот батник (удаление файлов по маске).
Нужно чтобы в директориях оставались только определенные файлы.

Код: Выделить весь код
chcp 1251
for %%i in (jpg mp3) do set $.%%i=_
for %%i in ("c:\temp and music\"*) do if not defined $%%~xi (
del /s/f/q "%%i"
echo.%%i >>lod_del_files.txt
)

Отправлено: 22:17, 17-08-2011 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход