Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/120: Рейтинг темы: голосов - 120, средняя оценка - 4.62
1 / 1 / 0
Регистрация: 07.02.2017
Сообщений: 14
1

Копирование файлов по маске из подкаталогов

10.03.2020, 16:58. Показов 22997. Ответов 27

Author24 — интернет-сервис помощи студентам
Доброго времени! Столкнулся с такой дилеммой: нужен батник который будет копировать все файлы с определённым расширением *.xls из подкаталогов определённой папки. Самое важное что конкретного пути нет и уровень подкаталогов не известен. В общем, нужен скрипт который будет шерстить по всем подкаталогам папки, искать файлы формата XLS и копировать их в одну папку. Я знаю что в команде del можно указать путь со звёздочкой (del /q \\dbs\bases\*\*.xls) и будут удаляться определённые файлы со всех подкаталогов какие имеются, пробовал такое в copy, xcopy, robocopy - не катит((((
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.03.2020, 16:58
Ответы с готовыми решениями:

Поиск файлов по определённой маске в указанной папке без учёта содержимого её подкаталогов
Всем привет. Встала очередная задача, не могу самостоятельно разобраться. Ниже выложен код,...

CMD Копирование файлов всех подкаталогов
Приветствую! Мне необходимо пройти по файлам указанного каталога(D:\parentfolder\) и всех его...

Копирование файлов с определенным расширением со всех подкаталогов определенной папки
Всем доброго времени суток. Ребят, прошу прощения если данная тема уже существует, но решения я не...

Копирование файлов Excel из всех подкаталогов определенной папки в отдельную папку
Описываю ситуацию: есть папка в которой (условно) 100 папок, в каждой папке по три файла разного...

27
4334 / 2124 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
10.03.2020, 19:15 2
Цитата Сообщение от hellcallou Посмотреть сообщение
пробовал такое в
не верится, особенно после
Цитата Сообщение от hellcallou Посмотреть сообщение
del /q
Цитата Сообщение от hellcallou Посмотреть сообщение
со всех подкаталогов
(кое-какого ключа не хватает)
0
3049 / 1056 / 475
Регистрация: 29.05.2016
Сообщений: 4,441
11.03.2020, 11:46 3
Добрый день! Код:
Windows Batch file
1
2
3
4
5
6
@set "folder1=Полный путь до папки, из которой файлы должны быть скопированы"
@set "folder2=Полный путь до папки, в которую файлы должны быть быть скопированы"
@for /f "delims=" %%a in ('dir "%folder1%\*.xls" /A-d/B/S') do @(
    xcopy "%%a" "%folder2%"
)
@pause
Добавлено через 37 минут
На случай, если среди файлов .xls окажутся файлы .xlsx:
Windows Batch file
1
2
3
4
5
6
@set "folder1=Полный путь до папки, из которой файлы должны быть скопированы"
@set "folder2=Полный путь до папки, в которую файлы должны быть скопированы"
@for /f "delims=" %%a in ('dir "%folder1%\*.xls" /A-d/B/S ^| findstr /E /L ".xls"') do @(
    xcopy "%%a" "%folder2%"
)
@pause
0
1 / 1 / 0
Регистрация: 07.02.2017
Сообщений: 14
11.03.2020, 13:01  [ТС] 4
Большое спасибо! Работает! Но есть ещё один момент
"Полный путь до папки, из которой файлы должны быть скопированы" должен выглядеть так: D:\2020_%mes%\T*0%per%, потому что в основном каталоге находятся подкаталоги Т01Р01, Т02Р01 ... Т17Р01 и Т01Р02, Т02Р02 ... Т17Р02, и нужно выбирать с каким окончанием папку выбирать, либо Р01 либо Р02. В Общем по маске T*0%per%, где %per% - 1 или 2. Я так попробовал, не получается. Нельзя задавать * в названии папок
0
3049 / 1056 / 475
Регистрация: 29.05.2016
Сообщений: 4,441
11.03.2020, 13:11 5
Цитата Сообщение от hellcallou Посмотреть сообщение
Большое спасибо! Работает! Но есть ещё один момент
На здоровье. Давайте ещё раз получим понимание того, что Вы хотите. Есть каталог, в котором есть некое множество подкаталогов, из которых, в свою очередь, необходимо скопировать файлы .xls в определённый каталог. Правильно?
Итак,
Цитата Сообщение от hellcallou Посмотреть сообщение
нужно выбирать с каким окончанием папку выбирать
Как Вы хотите выбирать? Можно реализовать это с помощью диалога с пользователем либо сами руками в сценарии каждый раз менять будете.
P.S. Я правильно понимаю, что Вы хотите осуществлять поиск и копирование файлов из определённых подкаталогов, а не всех?
0
1 / 1 / 0
Регистрация: 07.02.2017
Сообщений: 14
11.03.2020, 13:45  [ТС] 6
Хочу через диалог по средствам set /P или через условие задать переменную %per% , и указать её в маску подкаталогов (Т*Р0%per%). Поиск осуществлять в множестве папок по пути D:\2020_%mes%\Т*Р0%per% - в котором так же есть подкаталоги, но их имя не имеет значение, вот от туго и надо вытянуть *.xls.
0
3049 / 1056 / 475
Регистрация: 29.05.2016
Сообщений: 4,441
11.03.2020, 13:59 7
Цитата Сообщение от hellcallou Посмотреть сообщение
2020_%mes%
%mes% - это часть имени каталога или раскрытие переменной?

Добавлено через 3 минуты
Цитата Сообщение от hellcallou Посмотреть сообщение
Т*Р0
Тут тоже хотелось бы получить понимание. Что должно быть вместо звёздочки? Это должна быть константа или переменная?
0
1 / 1 / 0
Регистрация: 07.02.2017
Сообщений: 14
11.03.2020, 14:35  [ТС] 8
1) %mes% - это переменная которая задаётся в диалоге
2) Т*P0%per% - это маска названия каталога, где звёздочка это любое значение, может быть 01, 02, 03 и т.д., и их может быть много, и необязательно эти цифры, для этого * и ставиться что бы скрипт выбирал все каталоги с ключевыми символами Т Р0 и переменной %per%, а то что между Т и Р может быть что угодно. С файлами это работает идеально, а с папками напряг.

Добавлено через 1 минуту
Цитата Сообщение от Karen87 Посмотреть сообщение
%mes% - это часть имени каталога или раскрытие переменной?
Да, часть имени каталога, переменная которая задаётся пользователем
0
6228 / 2670 / 1051
Регистрация: 06.06.2017
Сообщений: 9,127
11.03.2020, 15:02 9
Цитата Сообщение от hellcallou Посмотреть сообщение
пробовал такое в ... xcopy, robocopy - не катит(
Плохо пробовали:
Windows Batch file
1
xcopy /chkqrsy C:\Input\*.xls D:\Output
Windows Batch file
1
robocopy C:\Input D:\Output *.xls /s /njh /njs /ndl /nfl
0
1 / 1 / 0
Регистрация: 07.02.2017
Сообщений: 14
11.03.2020, 15:23  [ТС] 10
Цитата Сообщение от FlasherX Посмотреть сообщение
1
xcopy /chkqrsy C:\Input\*.xls D:\Output

robocopy C:\Input D:\Output *.xls /s /njh /njs /ndl /nfl
Не подходит. Главное условие это работа с подкаталогами по маске. Выше я объяснял ситуацию.
0
3049 / 1056 / 475
Регистрация: 29.05.2016
Сообщений: 4,441
11.03.2020, 16:17 11
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@setlocal EnableDelayedExpansion
@set "folder2=Полный путь до папки, в которую файлы должны быть скопированы"
@set /p "mes=Введите значение переменной mes: "
@echo Выберите из предложенных вариантов подходящий (Введите a или b):
@echo a) 1
@echo b) 2
@set /p "per=Выбор: "
@for /d %%a in (D:\2020_%mes%\T*P0%per%) do @(
    set "folder=%%a"
    @for /f "delims=" %%a in ('dir "!folder!\*.xls" /A-d/B/S ^| findstr /E /L ".xls"') do @(
        xcopy "%%a" "%folder2%"
    )
)
@pause
Добавлено через 13 минут
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@setlocal EnableDelayedExpansion
@set "folder2=Полный путь до папки, в которую файлы должны быть скопированы"
@set /p "mes=Введите значение переменной mes: "
@echo Выберите из предложенных вариантов подходящий для переменной per (Введите a или b):
@echo a) 1
@echo b) 2
@set /p "per=Выбор: "
@for /d %%a in (D:\2020_%mes%\T*P0%per%) do @(
    set "folder=%%a"
    @for /f "delims=" %%a in ('dir "!folder!\*.xls" /A-d/B/S ^| findstr /E /L ".xls"') do @(
        xcopy "%%a" "%folder2%"
    )
)
@pause
Вам лишь необходимо во второй строчке прописать путь до каталога, в который будут скачиваться файлы

Добавлено через 17 минут
Заметил ошибку. Исправленный вариант:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@setlocal EnableDelayedExpansion
@set "folder2=D:\zadachka"
@set /p "mes=Введите значение переменной mes: "
@echo Выберите из предложенных вариантов подходящий для переменной per (Введите a или b):
@echo a) 1
@echo b) 2
@set /p "per=Выбор: "
@if %per%==a (
    set per=1
) else (
    set per=2
)
@for /d %%a in (D:\2020_%mes%\T*P0%per%) do @(
    set "folder=%%a"
    @for /f "delims=" %%a in ('dir "!folder!\*.xls" /A-d/B/S ^| findstr /E /L ".xls"') do @(
        xcopy "%%a" "%folder2%"
    )
)
@pause
1
6228 / 2670 / 1051
Регистрация: 06.06.2017
Сообщений: 9,127
11.03.2020, 16:19 12
Цитата Сообщение от hellcallou Посмотреть сообщение
Не подходит. Главное условие это работа с подкаталогами по маске.
А *.xls — это что?
Цитата Сообщение от hellcallou Посмотреть сообщение
Выше я объяснял ситуацию.
Новоявленные условия к моему ответу не относятся. Он давался на цитату из первого поста.
0
3049 / 1056 / 475
Регистрация: 29.05.2016
Сообщений: 4,441
11.03.2020, 16:43 13
И финальный штрих:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@setlocal EnableDelayedExpansion
@set "folder2=D:\zadachka"
@set /p "mes=Введите значение переменной mes: "
@echo Выберите из предложенных вариантов подходящий для переменной per:
@echo a) 1
@echo b) 2
@set /p "per=Введите a или b: "
@if %per%==a (
    set per=1
) else (
    set per=2
)
@for /d %%a in (D:\2020_%mes%\T*P0%per%) do @(
    set "folder=%%a"
    @for /f "delims=" %%a in ('dir "!folder!\*.xls" /A-d/B/S ^| findstr /E /L ".xls"') do @(
        xcopy "%%a" "%folder2%"
    )
)
@pause
Добавлено через 21 минуту
Не забываем во второй строчке кода изменить мой путь на свой
1
6228 / 2670 / 1051
Регистрация: 06.06.2017
Сообщений: 9,127
11.03.2020, 18:23 14
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@echo off&setlocal enabledelayedexpansion&chcp 1251>nul
set in=D:\2020_
set "out=E:\XLSbase\2020\"
 
:q
set /p mes="Введите вторую часть имени после !in!: "
if not exist "%in%%mes%\" cls&echo Нет папки %in%%mes% ^^!&goto q
:i
cls&set /p num="Введите 1 или 2 в конце T№№P0?: "
if !num! lss 1 goto i
if !num! gtr 2 goto i
set "in=!in!!mes!\"
for /f "delims= eol=" %%f in ('dir "%in%*.xls" /a-d/b/s^|findstr/b "!in:\=[\\]!T.*P0%num%[\\]"') do ^
xcopy /chikqry "%%f" "!out!" >nul
1
4334 / 2124 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
11.03.2020, 19:48 15
Windows Batch file
1
2
3
4
5
6
7
8
9
@echo off
echo Выбор месяца:& set /p mes=&cls
echo Выбор части каталога:& set /p per=&cls
set "d1=C:\2020_%mes%"
set "d2=Т*Р0%per%"
set "ext=xls"
 
for /f "delims=" %%a in ('forfiles /p "%d1%" /s /m "%d2%" /c "cmd /c echo @path"') do >nul xcopy /cirqy "%%~a\*.xls" "OUT\"
pause>nul
1
1 / 1 / 0
Регистрация: 07.02.2017
Сообщений: 14
12.03.2020, 16:39  [ТС] 16
Цитата Сообщение от alpap Посмотреть сообщение
@echo off
echo Выбор месяца:& set /p mes=&cls
echo Выбор части каталога:& set /p per=&cls
set "d1=C:\2020_%mes%"
set "d2=Т*Р0%per%"
set "ext=xls"
for /f "delims=" %%a in ('forfiles /p "%d1%" /s /m "%d2%" /c "cmd /c echo @path"') do >nul xcopy /cirqy "%%~a\*.xls" "OUT"
pause>nul
ОШИБКА: Файлы типа "Т*Р01" не найдены.

Добавлено через 26 минут
Короче, решил проблему примитивно, но надёжно! Использовал данный скрипт и повторил циклы столько раз, сколько нужно подпапок Т*Р0%per%
Цитата Сообщение от Karen87 Посмотреть сообщение
for /f "delims=" %%a in ('dir "%folder1%\*.xls" /A-d/B/S') do @(
    xcopy "%%a" "%folder2%"
Теперь появился ещё один вопрос, не знаю, возможно нужно новую тему создавать, а быть может кто и тут ответит... Как в этот цикл добавить ещё один, что бы переименовывал фалы с одинаковым именем, если такие попадаются, тоесть добавлял +1. Не знаю в какую часть его закинуть.
0
3049 / 1056 / 475
Регистрация: 29.05.2016
Сообщений: 4,441
12.03.2020, 17:15 17
Цитата Сообщение от hellcallou Посмотреть сообщение
Короче, решил проблему примитивно, но надёжно! Использовал данный скрипт и повторил циклы столько раз, сколько нужно подпапок Т*Р0%per%
А Вы пробовали последнюю версию моего скрипта? Не отрабатывает?
0
4334 / 2124 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
12.03.2020, 19:25 18
Цитата Сообщение от hellcallou Посмотреть сообщение
ОШИБКА: Файлы ... не найдены.
Следите за путями в коде
Цитата Сообщение от alpap Посмотреть сообщение
set "d1=C:\2020_%mes%"
или же у вас маска не такая как указываете потому что факты говорят обратное:
Копирование файлов по маске из подкаталогов
0
3049 / 1056 / 475
Регистрация: 29.05.2016
Сообщений: 4,441
13.03.2020, 00:47 19
Цитата Сообщение от hellcallou Посмотреть сообщение
Теперь появился ещё один вопрос, не знаю, возможно нужно новую тему создавать, а быть может кто и тут ответит... Как в этот цикл добавить ещё один, что бы переименовывал фалы с одинаковым именем, если такие попадаются, тоесть добавлял +1.
А если этих одинаковых файлов более одного? Каков алгоритм переименования? Допустим, "имя файла+1.xls" - первое совпадение. Как быть со вторым и последующими? Создавать "имя файла+2.xls" и т.д. или "имя файла+1+1.xls"?
0
3049 / 1056 / 475
Регистрация: 29.05.2016
Сообщений: 4,441
13.03.2020, 10:40 20
Цитата Сообщение от Karen87 Посмотреть сообщение
"или имя файла+1+1.xls"?
Глупо было с моей стороны. Как я вижу:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@setlocal EnableDelayedExpansion
@set "folder2=D:\zadachka"
@set /p "mes=Введите значение переменной mes: "
@echo Выберите из предложенных вариантов подходящий для переменной per:
@echo a) 1
@echo b) 2
@set /p "per=Введите a или b: "
@if %per%==a (
    set per=1
) else (
    set per=2
)
@for /d %%a in (D:\2020_%mes%\T*P0%per%) do @(
    set "folder=%%a"
    @for /f "delims=" %%a in ('dir "!folder!\*.xls" /A-d/B/S ^| findstr /E /L ".xls"') do @(
        set "file=%%a"
        call :step_1 "!file!"
    )
)
@pause
@exit
:step_1
@if exist "%folder2%\%~nx1" (
    set "file_trace1=%folder2%\%~nx1"
    set "file_original=%~n1"
    set /A summa=1
    set "file_modify=!file_original!+!summa!"
    set "file_modify1=!file_original!+"
) else (
    xcopy "%~1" "%folder2%"
    exit /b
)
@for /f "delims=" %%a in ('dir "%folder2%" /A-d/B/S ^| findstr "!file_modify1!"') do @(
            set /A summa+=1
            set "file_modify=!file_original!+!summa!"
)
@set "file_trace1=!file_trace1:%file_original%=%file_modify%!"
@echo f | xcopy "%~1" "!file_trace1!"
@exit /b
По итогу в случае совпадения имён файлов должны получить следующее. Например, есть файл test.xls

Добавлено через 7 минут
По итогу в случае совпадения имён файлов должны получить следующее. Например, есть файл test.xls. В случае первого совпадения данный файл будет скопирован как test+1.xls, в случае второго совпадения как test+2.xls и т.д. Файл с другим именем, например, log.xls в случае первого совпадения будет скопирован как log+1.xls и т.д.

Добавлено через 3 минуты
Единственный момент, который я не смог реализовать - это задание поиска переменной в конце строки (33 строка кода). Использование ключа /E приводит к тому, что результат поиска всегда пустой, несмотря на то, что заданная для поиска строка имеется в выводе. В чём может быть проблема?
0
13.03.2020, 10:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.03.2020, 10:40
Помогаю со студенческими работами здесь

Копирование файлов в папки по маске файла и маске папки
Добрый день! Товарищи, помогите. Возникла надобность раскладывать файлы по маске папки и маске...

Копирование файлов с определённым расширением из всех подкаталогов и запись их имён в текстовый файл
Доброго времени суток. Задача немного похожа на описанную в этой теме. Нужен bat, который: все...

Копирование всех файлов и подкаталогов, созданных на предыдущем месяце. Как это сделать?
Пожалуйста помогите написать батник, или дайте хотя бы совет, ссылку в какую сторону смотреть....

Копирование каталога с сетевого диска в каталог на локальном диске с заменой всех подкаталогов и файлов
Dragokas, здравствуйте, помогите моей проблеме, поиски решений пока ни к чему не привели, может...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru