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

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

Ответить
Настройки темы
CMD/BAT - [решено] Распределение файлов о папкам, от числового значения в имени файла.

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


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

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


Друзья, здравствуйте.
Помогите пожалуйста с решением задачки.

а) Есть куча конечных папок (Обзовём их "B", "C", "D", "E", "F", "G" и "H"), обозначеных как переменные, имя которых является неким бессмысленным числовым значением.
б) Есть изначальная папка, в которой складывается куча файлов, в ЧАСТИ имени каждого из файлов обязательно есть число, которое ТОЧНО совпадает с именем одной из конечных папок.

Задача - распределить все файлы из изначальной папки, в соответствии с пунктами "a" и "b", то-есть:
чтобы файл с именем "файл_01010101.txt" переместился в папку "01010101"
чтобы файл с именем "файл_02020202.txt" переместился в папку "02020202"
чтобы файл с именем "файл_03030303.txt" переместился в папку "03030303"
и так далее.

Туго у меня с FOR и регулярками, по этому прошу помощи.
Всем огромное спасибо!

Отправлено: 10:32, 12-02-2019

 

Ветеран


Contributor


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

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


POSTREALITY, количество знаков в числе постоянное? Перед числом обязательно "_"? Число в конце имени? А если папки с подходящим именем нет?

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 10:39, 12-02-2019 | #2



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

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


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


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

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


megaloman,
"Количество знаков в числе постоянное?" - ДА (во всех случаях - ровно 20 цифр)
Перед числом обязательно "_"? - к сожалению, ДА.
"Число в конце имени?" - ДА
"А если папки с подходящим именем нет?" - в конце скрипта добавлю пересчёт файлов в папке и выведу сообщение в консоль типа "в папке осталось n файлов".
Большое спасибо!

Последний раз редактировалось POSTREALITY, 12-02-2019 в 11:37.


Отправлено: 11:10, 12-02-2019 | #3


Ветеран


Contributor


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

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


Код: Выделить весь код
@Echo Off
Cls
	Set "FileIn=Z:\Box_In\*_*.txt"
	Set "Delim=_"
	Set "BoxOut=Z:\Box_Out"

	For %%i In ("%FileIn%") Do Call :Name "%BoxOut%" "%Delim%" "%%i"

	Set /A N=0
	For %%i In ("%FileIn%") Do Set /A N+=1
	Echo !!! Осталось неперемещенными %N% файлов "%FileIn%"
pause
GoTo :Eof

:Name
	Set "S=%~n3"
	:Begin
		Set "SS=%S%
		Call Set "S=%%SS:*%~2=%%"
	If Not "%SS%"=="%S%" GoTo :Begin

rem	If Not Exist "%~1\%S%" Md "%~1\%S%"
	If Not Exist "%~1\%S%" Exit /B 1
	>nul Move /Y %3 "%~1\%S%\"
Exit /B 0

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

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

Отправлено: 12:02, 12-02-2019 | #4


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


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

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


megaloman,

Большое спасибо!

Что до :Name примерно понял, что после вообще не понимаю

Подскажите пожалуйста, тут есть одно НО:
У меня "%BoxOut%" является не единой директорией. Их под 50 разных. Я их обозначил переменными типа:
SET "00000000000000000000=X:\папка\конечная папка"
SET "11111111111111111111=X:\папка2\подпапка\конечная папка"
SET "22222222222222222222=X:\папка\подпапка2\конечная папка"
SET "33333333333333333333=X:\ещё какой нибудь путь к конечной папке"
Единственное что объединяет конечные папки - они все лежат на одном диске.
Как быть в таком случае?

Отправлено: 12:31, 12-02-2019 | #5


Ветеран


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

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


Цитата POSTREALITY:
У меня "%BoxOut%" является не единой директорией »
а очень желательно сделать именно так потому как
Цитата POSTREALITY:
Единственное что объединяет конечные папки - они все лежат на одном диске »
очень затруднит поиск, не сам поиск конкретно, а время, ушедшее на поиск папки по всему диску и еще надо предполагать совпадение имен с возможной другой такой папкой.
И да, лепить в код 50 переменных для путей поддиректорий неблагодарная и неправильная затея.

Отправлено: 12:40, 12-02-2019 | #6


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


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

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


alpap,
Цитата alpap:
а очень желательно сделать именно так потому как »
К сожалению, это технически не реально, потому как пути данных директорий созданы с определённой логикой и изменение данных путей приведёт к краху других систем.
Цитата alpap:
а время, ушедшее на поиск папки по всему диску »
Так ведь искать папки не надо, я же в переменных указываю полные пути к конечным папкам.

Отправлено: 12:44, 12-02-2019 | #7


Ветеран


Contributor


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

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


Код: Выделить весь код
@Echo Off
Cls
	Set "FileIn=Z:\Box_In\*_*.txt"
	Set "Delim=_"

	Set "@@Out1=Z:\Box_Out\01010101"
	Set "@@Out2=Z:\Box_Out\02020202"
	Set "@@Out3=Z:\Box_Out\03030303"

	For %%i In ("%FileIn%") Do Call :Name "@@Out" "%Delim%" "%%i"

	Set /A N=0
	For %%i In ("%FileIn%") Do Set /A N+=1
	Echo !!! Осталось неперемещенными %N% файлов "%FileIn%"
pause
GoTo :Eof

:Name
	Set "S=%~n3"
	:Begin
		Set "SS=%S%
		Call Set "S=%%SS:*%~2=%%"
	If Not "%SS%"=="%S%" GoTo :Begin
	FOR /F "usebackq tokens=1* delims==" %%i IN (`2^>nul Set "%~1"`) DO (
		If "%%~nj"=="%S%" >nul Move /Y %3 "%%j\" &&Exit /B 0
	)
Exit /B 1
Пути для Out-папок могут быть произвольными без "\" на конце

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

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

Отправлено: 13:17, 12-02-2019 | #8


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


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

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


megaloman,
Огромное спасибо!

Слегка доработал скрипт под свои нужды, работает все идеально.

P.S.: Не могли бы Вы посоветовать толковую литературу про...

Код: Выделить весь код
FOR /F "usebackq tokens=1* delims==" %%i IN (`2^>nul Set "%~1"`) DO (
		If "%%~nj"=="%S%" >nul Move /Y %3 "%%j\" &&Exit /B 0
	)
подобную магию?

Отправлено: 16:27, 12-02-2019 | #9


Ветеран


Contributor


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

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


Цитата POSTREALITY:
Не могли бы Вы посоветовать толковую литературу про... »
Как-то напряжно. Чаще всего смотрю Help по командам, например For /?
Здесь на портале есть в начале темы пункт с ссылками.
Но, прежде всего, наибольшую пользу я получаю от разбора решений задач и своих попыток что-то решать своими силами.
Что непонятно - спрашиайте.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

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

Отправлено: 16:54, 12-02-2019 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - [решено] Скрипт который раскидывает файлы по папкам, с частью имени этих файлов username-qq Скриптовые языки администрирования Windows 6 06-10-2018 18:30
CMD/BAT - распределение файлов по папкам по списку bellagio Скриптовые языки администрирования Windows 1 11-05-2014 13:14
CMD/BAT - [решено] Увеличение значения имени переменной или считывание строки файла в переменную VokaMut Скриптовые языки администрирования Windows 12 26-11-2012 15:54
CMD/BAT - [решено] Раскидать файлы по папкам согласно дате в имени файла spkvvs Скриптовые языки администрирования Windows 8 07-09-2012 15:00
CMD/BAT - [решено] Перемещение файлов из одной папки в разные в зависимости от имени файла Sarge81 Скриптовые языки администрирования Windows 4 20-09-2011 04:20




 
Переход