![]() |
Распределение файлов о папкам, от числового значения в имени файла.
Друзья, здравствуйте.
Помогите пожалуйста с решением задачки. а) Есть куча конечных папок (Обзовём их "B", "C", "D", "E", "F", "G" и "H"), обозначеных как переменные, имя которых является неким бессмысленным числовым значением. б) Есть изначальная папка, в которой складывается куча файлов, в ЧАСТИ имени каждого из файлов обязательно есть число, которое ТОЧНО совпадает с именем одной из конечных папок. Задача - распределить все файлы из изначальной папки, в соответствии с пунктами "a" и "b", то-есть: чтобы файл с именем "файл_01010101.txt" переместился в папку "01010101" чтобы файл с именем "файл_02020202.txt" переместился в папку "02020202" чтобы файл с именем "файл_03030303.txt" переместился в папку "03030303" и так далее. Туго у меня с FOR и регулярками, по этому прошу помощи. Всем огромное спасибо! |
POSTREALITY, количество знаков в числе постоянное? Перед числом обязательно "_"? Число в конце имени? А если папки с подходящим именем нет?
|
megaloman,
"Количество знаков в числе постоянное?" - ДА (во всех случаях - ровно 20 цифр) Перед числом обязательно "_"? - к сожалению, ДА. "Число в конце имени?" - ДА "А если папки с подходящим именем нет?" - в конце скрипта добавлю пересчёт файлов в папке и выведу сообщение в консоль типа "в папке осталось n файлов". Большое спасибо! |
Код:
@Echo Off |
megaloman,
Большое спасибо! Что до :Name примерно понял, что после вообще не понимаю :) Подскажите пожалуйста, тут есть одно НО: У меня "%BoxOut%" является не единой директорией. Их под 50 разных. Я их обозначил переменными типа: SET "00000000000000000000=X:\папка\конечная папка" SET "11111111111111111111=X:\папка2\подпапка\конечная папка" SET "22222222222222222222=X:\папка\подпапка2\конечная папка" SET "33333333333333333333=X:\ещё какой нибудь путь к конечной папке" Единственное что объединяет конечные папки - они все лежат на одном диске. Как быть в таком случае? |
Цитата:
Цитата:
И да, лепить в код 50 переменных для путей поддиректорий неблагодарная и неправильная затея. |
alpap,
Цитата:
Цитата:
|
Код:
@Echo Off |
megaloman,
Огромное спасибо! Слегка доработал скрипт под свои нужды, работает все идеально. P.S.: Не могли бы Вы посоветовать толковую литературу про... Код:
FOR /F "usebackq tokens=1* delims==" %%i IN (`2^>nul Set "%~1"`) DO ( |
Цитата:
Здесь на портале есть в начале темы пункт с ссылками. Но, прежде всего, наибольшую пользу я получаю от разбора решений задач и своих попыток что-то решать своими силами. Что непонятно - спрашиайте. |
|
megaloman,
Простите за назойливость, а не могли бы Вы ещё подсказать по данной теме. Есть у меня вначале скрипта функция Код:
SET /p prefix="Укажите добавляемый префикс: " Большое спасибо! P.S.: Два дня уже пытаюсь найти нормальную статью в интернете, чтобы разобраться с конструкциями типа Код:
%~n3 Код:
"S=%%SS:*%~2=%%" |
megaloman,
Большое спасибо! Сделал вот так: Код:
IF "%%~nj"=="%S%" >nul MOVE /Y %3 "%%j\" & REN "%%j\"*.* "%PREFIX%_ИМЯ ФАЙЛА %S%".* &&Exit /B 0 |
megaloman,
Надо в начало имени каждого файла, при перемещении добавить значение из переменной %PREFIX%, которое пользователь изначально вводит при запуске скрипта, функция Код:
SET /p prefix="Укажите добавляемый префикс: " Цитата:
Код:
MOVE /Y %3 "%%j\" |
megaloman,
Обнаружил МОЮ ошибку - названия конечных папок не могут быть произвольными, то есть скрипт считает что имя конечных папок должно полностью совпадать с %S%. Подскажите пожалуйста, а есть возможность чтобы скрипт не читал имя конечной папки, а просто перемещал файлы по путям, которые указаны в переменных @@Out1, @@Out2, @@Out3 и т.д.? То есть, необходимо, чтобы скрипт сравнивал только последние 20 цифр имени файла с именем переменной, а имя конечной папки в пути не имело значения. Огромное спасибо! |
POSTREALITY, Виноват, не увидел Ваш пост.
при перемещении добавить значение из переменной %PREFIX%, которое пользователь изначально вводит при запуске скрипта
Я ориентировался на постановку задачи, когда имеется полное соответствие цифрового кода файла и имени папки Код:
@Echo Off Код:
For %%i In ("%FileIn%") Do Echo Call :Name "@@Out" "%Delim%" "%%i" "%Prefix%" Для каждого из файлов по маске "%FileIn%" вызывается процедура :Name 1 аргумент - префикс переменных для Out-путей 2 - разделитель перед цифровым кодом в конце имени файла 3 - полное имя файла из For 4 - вводимый префикс В принципе, 1,2,4 аргументы можно было бы и не делать, а в процедуре их нарисовать явным образом, но я считаю, что такая работа с процедурой более гибкая: не надо менять текст процедуры при изменении данных, нужно только изменить параметры при вызове процедуры. Аргументы при вызове взял в кавычки, чтобы было возможным иметь в них пробелы. Попробуйте вставить после :Name (естественно, без Echo перед Call Код:
:Name Далее, проделайте For /? - полУчите help по For. Еще лучше, сделайте For /? >C:\_For.txt, и читайте в текстовом редакторе этот help. В самом его конце пояснения конструкций типа %~nI (аналогично и %~n1) То есть, Set "S=%~n3" позволяет из полного имени файла, переданного в 3 аргументе, выделить его имя в переменную S. Почему я стараюсь брать равенство после Set в кавычки: чтобы при присваивании к значению не "прицепились" случайные пробелы при создании в текстовом редакторе кода: я не умею работать безошибочно. Call Set "S=%%SS:*%~2=%%" Для понимания проделайте Set /? >C:\_set.txt. Почитайте. Здесь организован неявный цикл: допустим %SS% изначально соответствует тра_ля_ля_суффикс При первом вызове %тра_ля_ля_суффикс:_*=% получим ля_ля_суффикс, то есть всё, что встретилось до первого вхождения _ "съелось" Эту операцию проделали несколько раз, чтобы остался только суффикс в конце имени. Форма вызова Call Set "S=%%SS:*%~2=%%" использована потому, что среди параметров замены использовали переменную %~2 Что Вам нужно: - чтобы последние 20 знаков в имени файла ТОЧНО соответствовало имени папки? |
Цитата:
Есть изначальная папка, в ней лежат файлы: *_00000000000000000000.pdf *_11111111111111111111.pdf *_22222222222222222222.pdf Последние 20 цифр имени файла мы с Вами обозначаем как переменную "S" (на сколько я понял). Есть переменные, обозначенные как: Код:
SET "@@Out00000000000000000000=X:\папка\конечная папка" То есть, хотелось бы, чтобы зависимости строились между "S" в имени файла и именем переменной @@Out..., а имя конечных папок могло быть совершенно любым, к и в целом весь путь к этой папке. Ещё раз огромное Вам спасибо за помощь и объяснения! |
Код:
@Echo Off |
Время: 06:24. |
Время: 06:24.
© OSzone.net 2001-