|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку |
|
||||
|
|
CMD/BAT - [решено] Батник сбора файлов из поддиректорий в общую папку
|
|
Новый участник Сообщения: 9 |
Уважаемые, прошу помощи по такому вопросу:
Имеем многоуровневую развитую структуру директорий "Главная-подчиненные". Например, 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 |
|
Ветеран Сообщения: 1759
|
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 | |
|