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

Перенос каталогов и файлов

19.12.2018, 13:44. Показов 3367. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Друзья, необходимо выборочно перенести каталоги (и подкаталоги) и файлы в резервную папку.
Список выбранных каталогов сохранён в файле dir.txt, например:
Docs\!Каталог 1
Docs\Каталог 2
Docs\Каталог 3

Для выборочного переноса выполняется следующий код:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@echo off
cls
setlocal enabledelayedexpansion
set curdisk=%~d0
 
for /f "usebackq delims=" %%A in ("dir.txt") do (
    Set "folder_from="%curdisk%\%%A""
    set "folder_where="%curdisk%\%date:~6,4%-%date:~3,2%-%date:~0,2% reserv\%%A""
 
    if not exist !folder_where! md !folder_where!
    
    move /Y !folder_from!\*.* !folder_where!
    FOR /F "delims=" %%I IN ('DIR /B /AD !folder_from!') DO (
        move /Y !folder_from!\"%%I" %1 !folder_where!
    )
if exist !folder_from! rd !folder_from! | echo !folder_from!
)
Но если в названии выбранного каталога или в названии его подкаталогов имеется "!" (восклицательный знак), код не работает. Из названия каталогов/подкаталогов исчезает "!".

Если в файле dir.txt знак ! экранировать ^, код работает только с этим каталогом.
Docs\^!Каталог 1

Структура этого каталога может быть такой:
Docs\!Каталог 1
Docs\!Каталог 1\Папка 1!
Docs\!Каталог 1\!Папка 2
Docs\!Каталог 1\Папка !3
Docs\!Каталог 1\Папка 4
Т.е. ! знак может оказаться в любом месте в названии подкаталога и/или файлов.
Каким образом экранировать ! знак в подкаталогах и файлах этой папки?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.12.2018, 13:44
Ответы с готовыми решениями:

Перенос файлов по расширению (более 500), сохраняя структуру каталогов
Добрый день. Скрипт должен перемещать файлы по расширению (больше 500) сохраняя структуру каталогов Скрипт есть только для одного...

Архивирование определённых файлов из разных каталогов с сохранением структуры этих каталогов
Здравствуйте. Суть задачи. Есть определенный каталог (C:\X), в котором в разных подкаталогах лежат различные файлы и папки (количество,...

Копирование файлов из разных каталогов в каталоги с именами, соответствующими номерам в именах файлов
Добрый день! Помогите решить проблему. Есть семь папок (cam_1, cam_2, cam_3 и.т.д) с фотографиями (cam_1_00052.JPG, cam_1_00053.JPG,...

18
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
19.12.2018, 14:06
два ^^

Добавлено через 2 минуты
вообще странно как код еще работает, стр14 и 16 по идее должны его положить.

Добавлено через 7 минут
а если в кавычках будет, то так:
Windows Batch file
1
set "a=C:\Users\^^^!Каталог 1"
Добавлено через 1 минуту
но я бы делал это все без setlocal enabledelayedexpansion и таких проблем бы не было
0
1 / 1 / 0
Регистрация: 13.12.2018
Сообщений: 26
19.12.2018, 15:19  [ТС]
Не разобрался с двумя ^^.

Где их нужно указать в коде?

А перед ! знаком в файле со списком каталогов dir.txt оставить одну ^?
Docs\^!Каталог 1
Docs\Каталог 2
Docs\Каталог 3

Не подскажете как выборочный перенос каталогов с файлами может выглядеть без setlocal enabledelayedexpansion? И де лучше хранить выборочный список каталогов: в батнике или отдельном файле?
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
19.12.2018, 15:43
Цитата Сообщение от RealDT Посмотреть сообщение
Не подскажете как
т.е. сделайте все за меня полностью - потому что код надо полностью переписать.
0
1 / 1 / 0
Регистрация: 13.12.2018
Сообщений: 26
19.12.2018, 16:00  [ТС]
Спасибо. Конечно же не нужно этого делать.
Может у кого есть чем поделиться по теме вопроса или похожими решениями (в т.ч. ссылки на форуме)? Как организовать перенос файлов и каталогов с ! знаками в их названиях?
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
20.12.2018, 00:00
dir.txt
Кликните здесь для просмотра всего текста

Docs\!Каталог 1
Docs\Каталог 2
Docs\Каталог 3

Каталог "Docs"
Кликните здесь для просмотра всего текста

Структура папок
C:\DOCS
├───!Каталог 1
│ │ file 11.txt
│ │
│ ├───!Папка 2
│ │ file 222.txt
│ │
│ ├───Папка !3
│ │ file 333.txt
│ │
│ ├───Папка 1!
│ │ file 111.txt
│ │
│ └───Папка 4
│ file 444.txt

├───Каталог 2
│ │ ff 22.txt
│ │
│ ├───!Папка 22
│ │ ff 222.txt
│ │
│ └───Папка !23
│ ff 333.txt

└───Каталог 3
│ fn 33.txt

├───!Папка !35
│ fn 333.txt

└───Папка 33!
fn 334.txt



код
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
set "d=C:"
set "p=C:\rezerv"
set "f=dir.txt"
 
<"%f%" (for /f "delims=" %%a in ('more') do @call :cp "%d%" "%%a" "%p%")
pause& exit
 
:cp
 if not exist "%~3" md "%~3"
 pushd "%~1\%~2"
  for /f "delims=" %%a in ('dir /ad/b/s') do 2>nul md "%~3%%~pnxa"
  for /f "delims=" %%a in ('dir /a-d/b/s') do >nul copy "%%a" "%~3%%~pnxa"
 popd
exit /b
После выполнения, каталог "rezerv"
Кликните здесь для просмотра всего текста

Структура папок
C:\REZERV
└───Docs
├───!Каталог 1
│ │ file 11.txt
│ │
│ ├───!Папка 2
│ │ file 222.txt
│ │
│ ├───Папка !3
│ │ file 333.txt
│ │
│ ├───Папка 1!
│ │ file 111.txt
│ │
│ └───Папка 4
│ file 444.txt

├───Каталог 2
│ │ ff 22.txt
│ │
│ ├───!Папка 22
│ │ ff 222.txt
│ │
│ └───Папка !23
│ ff 333.txt

└───Каталог 3
│ fn 33.txt

├───!Папка !35
│ fn 333.txt

└───Папка 33!
fn 334.txt


1
1 / 1 / 0
Регистрация: 13.12.2018
Сообщений: 26
20.12.2018, 17:33  [ТС]
Ок. Предложенный вариант обрабатывает каталоги и файлы с "!" восклицательными знаками, но не решает основную задачу - поскольку:
- только копирует (не переносит) файлы и каталоги;
- обрабатывает каталоги и файлы только из места расположения батника;
- список каталогов, указанных в файле dir.txt не используется для выборочной обработки.

Уточню необходимый результат:
1. В файле dir.txt размещается выборочный список каталогов, которые нужно перенести в резервную папку (Reserv).
2. Батник переносит (не копирует) каталоги из списка каталогов (dir.txt) в резервную папку (Reserv).
3. Батник может обработать восклицательные знаки, которые могут содержаться в именах каталогов и файлов (не исключает/стирает их из имён).
Мой вариант выполняет условие 1. и 2., но не обрабатывает каталоги, в названии которых имеются восклицательные знаки.
Может у кого-то ещё есть похожие решения? Буду признателен вариантам доработки исходного кода с учётом возможности п. 3.
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
20.12.2018, 22:31
Цитата Сообщение от RealDT Посмотреть сообщение
1. В файле dir.txt размещается выборочный список каталогов
Docs\!Каталог 1
Это дебильное указание пути для переноса уже имеющихся где-то файлов, почему не указывается полный путь, с диском?

Цитата Сообщение от RealDT Посмотреть сообщение
2. Батник переносит (не копирует) каталоги
ой-ой, добавить удаление всего каталога, который полностью скопирован, религия не позволяет или лень?

дальше разбирайтесь самостоятельно, более не смею вас беспокоить, успехов.
0
1 / 1 / 0
Регистрация: 13.12.2018
Сообщений: 26
21.12.2018, 10:53  [ТС]
Ок. Как этот ответ (с особым акцентом на лень, религию, дебильный каталог и т.п.) способствует решению задачи? Вероятно, что эти перечисленные свои особенности, вам и не позволяют найти решение...

Вот код, который переносит (не копирует) один заданный каталог и обрабатывает также каталоги/файлы с восклицательными знаками:
Windows Batch file
1
2
3
4
5
6
7
8
set curdisk=%~d0
Set dir1=Docs\!КОНТАКТЫ
Set folder_from=%curdisk%\%dir1%
Set folder_where=%curdisk%\%date:~6,4%-%date:~3,2%-%date:~0,2% reserv\%dir1%
if not exist "%folder_where%" md "%folder_where%"
if exist "%folder_from%\*.*" move /Y "%folder_from%\*.*" "%folder_where%"
FOR /F "delims=" %%I IN ('DIR /B /AD "%folder_from%"') DO (move /Y "%folder_from%\%%I" %1 "%folder_where%")
if exist %folder_from% rd %folder_from%
Пока не разобрался, как в переменную dir1 в цикле вносить новое значение из файла dir.txt со списком выбранных каталогов. Может у кого найдется решение?

Каталог в переменной dir1 указывается без диска, поскольку диск с батником является съёмным и на другом компе будет с другим именем, а команда move (а не copy & rd) на физическом уровне работает в разы быстрее, поскольку работает только в секторах HDD, где размещены ссылки на содержание файлов, а не данные этих файлов. Другими словами - copy резервирует и создаёт на диске новый блок данных, а move - только меняет ссылки на расположение этих данных. Скорость работы move и copy хорошо видна на больших файлах и незаметна если файлов много, но они небольшого размера.

alpap, поддержу вас - просьба более не беспокоить своими советами...
0
6981 / 2873 / 1104
Регистрация: 06.06.2017
Сообщений: 9,752
21.12.2018, 12:18
Windows Batch file
1
@echo off&for /f "delims=" %%d in ("dir.txt") do robocopy "%~d0\%%~d" "%~d0\%date:~6,4%-%date:~3,2%-%date:~0,2% reserv\%%d" /e /move /njh /njs /ndl /nfl
1
1 / 1 / 0
Регистрация: 13.12.2018
Сообщений: 26
21.12.2018, 12:47  [ТС]
Спасибо, код с robocopy работает, но есть значительные потери по времени из-за описанных причин выше.
Повторюсь: если move только переносит файлы, то robocopy их копирует с последующим удалением. Команда move (а не copy & rd или robocopy) на физическом уровне работает в разы быстрее, поскольку работает только в секторах HDD, где размещены ссылки на содержание файлов, а не данные этих файлов. Другими словами - copy/robocopy резервирует и создаёт на диске новый блок данных, а move - только меняет ссылки на расположение этих данных. Скорость работы move и copy/robocopy хорошо видна на больших файлах и незаметна если файлов много, но они небольшого размера.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
21.12.2018, 13:05
Цитата Сообщение от RealDT Посмотреть сообщение
Повторюсь: если move только переносит файлы, то robocopy их копирует с последующим удалением
PowerShell пробовали?

PowerShell
1
gc .\dir.txt |% {mi $_ .\Rezerv -fo}
0
6981 / 2873 / 1104
Регистрация: 06.06.2017
Сообщений: 9,752
21.12.2018, 14:40
RealDT, про этот косяк robocopy знаю, некоторым заходит. Почему майкрософт до сих пор не озаботилось его исправлением, мне неясно.
На vbs-е могу быстрый способ предложить, только нужно уточнение, что в тексте Docs\ всегда спереди. Если так, то логично было бы от этой приставки в нём избавиться и подставлять её как переменную.
0
1 / 1 / 0
Регистрация: 13.12.2018
Сообщений: 26
21.12.2018, 15:11  [ТС]
Ок. В тексте Docs\ может и не быть. Список выборочных каталогов для перемещения указываю в файле dir.txt, например, так:

Users\noname\Downloads\
Docs\МЕДИА
Docs\КОНТАКТЫ
Program Files\Far Manager\Plugins

При этом каталог указывается без диска, поскольку диск с батником является съёмным и на другом компе может быть с другим именем.
0
6981 / 2873 / 1104
Регистрация: 06.06.2017
Сообщений: 9,752
21.12.2018, 16:13
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Set oFSO = CreateObject("Scripting.FileSystemObject")
Drive = oFSO.GetDriveName(WSH.ScriptFullName) & "\"
OutDir = Year(Date) & "-" & Right("0" &_
Month(Date), 2) & "-" & Right("0" & Day(Date), 2) & " reserv"
With CreateObject("Shell.Application")
  .NameSpace(Drive).NewFolder OutDir
  Set OutDir = .NameSpace(Drive & OutDir)
End With
Set List = oFSO.OpenTextFile("dir.txt")
Do : Fold = Drive & Trim(List.ReadLine)
  If oFSO.FolderExists(Fold) Then OutDir.MoveHere Fold, 5652
Loop Until List.AtEndOfStream : List.Close
Скрытые, системные и только для чтения объекты также без проблем переместятся.
1
1 / 1 / 0
Регистрация: 13.12.2018
Сообщений: 26
26.12.2018, 17:03  [ТС]
Спасибо за варианты решения.
Вот, на мой взгляд, оптимальное решение в формате BAT/CMD:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
@echo off
set curdisk=%~d0
 
Set folder_where=%curdisk%\%date:~6,4%-%date:~3,2%-%date:~0,2% reserv
 
if not exist "%folder_where%" md "%folder_where%"
 
FOR /F "tokens=1,2* delims=;" %%I IN (dir.txt) DO (
    if not exist "%folder_where%\%%J" md "%folder_where%\%%J"
    move /Y "%curdisk%\%%I" "%folder_where%\%%J"
)
При этом структура файла dir.txt должна быть такой:
Каталог1\!Папка11\!Папка111\Папка1111;Каталог1\!Папка11\!Папка111
Каталог1\!Папка12\!Папка121\Папка1121;Каталог1\!Папка12\!Папка121
Каталог2\Папка12\Папка!331;Каталог2\Папка12
Каталог3\Папка13\;Каталог3

Т.е.:
- в переменную %%I записывается каталог "что переносить";
- в переменную %%J записывается часть каталога "куда переносить", полный путь "куда переносить" будет таким %folder_where%\%%J

Отличия от начального варианта решения:
- убрал SETLOCAL enabledelayedexpansion, который удалял воскличательные знаки в именах каталогов и файлах;
- убрал внешний цикл FOR (оставил только один цикл);
- добавил неявную переменную %%J
- изменил структуру dir.txt, в котором каждая строка формирует значения для %%I и %%J.
0
6981 / 2873 / 1104
Регистрация: 06.06.2017
Сообщений: 9,752
26.12.2018, 19:07
Цитата Сообщение от RealDT Посмотреть сообщение
Вот, на мой взгляд, оптимальное решение в формате BAT/CMD:
Оптимальным при отсутствии контроля формата дат в региональных настройках это назвать не получится.
И разноимённость, отмечанная сейчас в dir, в ТЗ вообще не сообщалось. Это по сути новые условия.
0
1 / 1 / 0
Регистрация: 13.12.2018
Сообщений: 26
27.12.2018, 10:47  [ТС]
Цитата Сообщение от FlasherX Посмотреть сообщение
Это по сути новые условия.
В целом, верно отмечено. Просто, покоя не давало, что первоначальный батник криво работает. Поэтому пришлось дорабатывать, комбинировать как-то...
Цитата Сообщение от FlasherX Посмотреть сообщение
контроля формата дат в региональных настройках
Для моих целей, этого варианта достаточно. Но, думаю, ищущие что-то похожее будут признательны если подскажете вариант реализации такого контроля.
Спс.

З.Ы. С powershell пока не разбирался...
0
6981 / 2873 / 1104
Регистрация: 06.06.2017
Сообщений: 9,752
27.12.2018, 12:39
Цитата Сообщение от RealDT Посмотреть сообщение
Поэтому пришлось дорабатывать, комбинировать как-то...
Можно было по-другому сделать: подставить спереди путей C:\ и вытаскивать родительские каталоги через %%~pI.
Цитата Сообщение от RealDT Посмотреть сообщение
ищущие что-то похожее будут признательны ...
Ищущие да обрящут. Множество раз поднималось в разделе.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.12.2018, 12:39
Помогаю со студенческими работами здесь

Создание каталогов и файлов
Вообще не разбираюсь в bat файлах пока что, а изучать времени мало, других долгов много. Помогите пожалуйста. Вижу что задание...

Смена владельца файлов и каталогов
Привет ребят, нужно написать батник: по 1 пункту показывался обладатель файла/папки по 2му изменялся владелец файла/папки...

Копирование файлов без каталогов
Добрый день! Помогите с такой задачей: не могу придумать батник который копирует определённые файлы с подкаталогов своего корневого...

Вывод списка файлов из каталогов
Разработать пакетный файл для вывода (на экран, файл, принтер) списка файлов из каталогов студентов. Шифр группы - из командной строки,...

Удаление всех файлов и каталогов по списку
Создайте командный файл, который удаляет все файлы и каталоги, в заданных каталогах, указанные в виде списка, занесенного в текстовый файл.


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru