|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Распределение файлов о папкам, от числового значения в имени файла. |
|
CMD/BAT - [решено] Распределение файлов о папкам, от числового значения в имени файла.
|
Новый участник Сообщения: 39 |
Друзья, здравствуйте.
Помогите пожалуйста с решением задачки. а) Есть куча конечных папок (Обзовём их "B", "C", "D", "E", "F", "G" и "H"), обозначеных как переменные, имя которых является неким бессмысленным числовым значением. б) Есть изначальная папка, в которой складывается куча файлов, в ЧАСТИ имени каждого из файлов обязательно есть число, которое ТОЧНО совпадает с именем одной из конечных папок. Задача - распределить все файлы из изначальной папки, в соответствии с пунктами "a" и "b", то-есть: чтобы файл с именем "файл_01010101.txt" переместился в папку "01010101" чтобы файл с именем "файл_02020202.txt" переместился в папку "02020202" чтобы файл с именем "файл_03030303.txt" переместился в папку "03030303" и так далее. Туго у меня с FOR и регулярками, по этому прошу помощи. Всем огромное спасибо! |
|
Отправлено: 10:32, 12-02-2019 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать |
Отправлено: 19:09, 12-02-2019 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 39
|
Профиль | Отправить PM | Цитировать megaloman,
Простите за назойливость, а не могли бы Вы ещё подсказать по данной теме. Есть у меня вначале скрипта функция Куда мне надо добавить "%prefix%_", чтобы команда MOVE при переносе, к каждому из файлов добавляла в начало имени указанный пользователем префикс с нижним подчёркиванием (один указанный префикс сразу ко всей текущей порции перемещаемых файлов). Большое спасибо! P.S.: Два дня уже пытаюсь найти нормальную статью в интернете, чтобы разобраться с конструкциями типа и (совсем не пойму что это значит), к сожалению, поиск толковой статьи пока что не приносит результатов ![]() |
Последний раз редактировалось POSTREALITY, 14-02-2019 в 11:23. Отправлено: 10:47, 14-02-2019 | #12 |
Новый участник Сообщения: 39
|
Профиль | Отправить PM | Цитировать |
Отправлено: 12:08, 14-02-2019 | #13 |
Новый участник Сообщения: 39
|
Профиль | Отправить PM | Цитировать megaloman,
Надо в начало имени каждого файла, при перемещении добавить значение из переменной %PREFIX%, которое пользователь изначально вводит при запуске скрипта, функция Цитата POSTREALITY:
|
|
Последний раз редактировалось POSTREALITY, 14-02-2019 в 13:29. Отправлено: 13:07, 14-02-2019 | #14 |
Новый участник Сообщения: 39
|
Профиль | Отправить PM | Цитировать megaloman,
Обнаружил МОЮ ошибку - названия конечных папок не могут быть произвольными, то есть скрипт считает что имя конечных папок должно полностью совпадать с %S%. Подскажите пожалуйста, а есть возможность чтобы скрипт не читал имя конечной папки, а просто перемещал файлы по путям, которые указаны в переменных @@Out1, @@Out2, @@Out3 и т.д.? То есть, необходимо, чтобы скрипт сравнивал только последние 20 цифр имени файла с именем переменной, а имя конечной папки в пути не имело значения. Огромное спасибо! |
Последний раз редактировалось POSTREALITY, 14-02-2019 в 14:35. Отправлено: 13:54, 14-02-2019 | #15 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать POSTREALITY, Виноват, не увидел Ваш пост.
при перемещении добавить значение из переменной %PREFIX%, которое пользователь изначально вводит при запуске скрипта
Я ориентировался на постановку задачи, когда имеется полное соответствие цифрового кода файла и имени папки @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" Set /P Prefix="Укажите добавляемый префикс: " For %%i In ("%FileIn%") Do Call :Name "@@Out" "%Delim%" "%%i" "%Prefix%" 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\%~4_%~nx3" &&Exit /B 0 ) Exit /B 1 ![]() Для каждого из файлов по маске "%FileIn%" вызывается процедура :Name 1 аргумент - префикс переменных для Out-путей 2 - разделитель перед цифровым кодом в конце имени файла 3 - полное имя файла из For 4 - вводимый префикс В принципе, 1,2,4 аргументы можно было бы и не делать, а в процедуре их нарисовать явным образом, но я считаю, что такая работа с процедурой более гибкая: не надо менять текст процедуры при изменении данных, нужно только изменить параметры при вызове процедуры. Аргументы при вызове взял в кавычки, чтобы было возможным иметь в них пробелы. Попробуйте вставить после :Name (естественно, без Echo перед Call Вы увидите значения передаваемых аргументов в процедуру при каждом вызове. Далее, проделайте 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 знаков в имени файла ТОЧНО соответствовало имени папки? |
------- Последний раз редактировалось megaloman, 14-02-2019 в 15:46. Отправлено: 15:03, 14-02-2019 | #16 |
Новый участник Сообщения: 39
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
Есть изначальная папка, в ней лежат файлы: *_00000000000000000000.pdf *_11111111111111111111.pdf *_22222222222222222222.pdf Последние 20 цифр имени файла мы с Вами обозначаем как переменную "S" (на сколько я понял). Есть переменные, обозначенные как: SET "@@Out00000000000000000000=X:\папка\конечная папка" SET "@@Out11111111111111111111=X:\папка2\подпапка\конечная папка" SET "@@Out22222222222222222222=X:\папка\подпапка2\конечная папка" SET "@@Out33333333333333333333=X:\ещё какой нибудь путь к конечной папке" То есть, хотелось бы, чтобы зависимости строились между "S" в имени файла и именем переменной @@Out..., а имя конечных папок могло быть совершенно любым, к и в целом весь путь к этой папке. Ещё раз огромное Вам спасибо за помощь и объяснения! |
|
Отправлено: 16:11, 14-02-2019 | #17 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать @Echo Off Cls Set "FileIn=Z:\Box_In\*_*.pdf" Set /A Len=20 Set "@@Out01010101010101010101=Z:\Box_Out\Варкалось!" Set "@@Out02020202020202020202=Z:\Box_Out\Варкалось!\Хливкие шорьки" Set "@@Out03030303030303030303=Z:\Box_Out\Варкалось!\Хливкие шорьки\Пырялись по наве" Set /P Prefix="Укажите добавляемый префикс: " FOR /F "usebackq tokens=1* delims==" %%i IN (`2^>nul Set "@@Out"`) DO ( Set "S=%%i" Call :Name "%%j" "%%S:~-%Len%%%" "%FileIn%" "%Prefix%_" ) Set /A N=0 For %%i In ("%FileIn%") Do Set /A N+=1 Echo !!! Осталось неперемещенными %N% файлов "%FileIn%" pause GoTo :Eof :Name Set "In=%~3" Call Set "In=%%In:.=%~2.%%" For %%f In ("%In%") Do >nul Move /Y "%%f" "%~1\%~4%%~nxf" Exit /B 0 |
------- Отправлено: 19:59, 14-02-2019 | #18 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Раскидать файлы по папкам согласно дате в имени файла | spkvvs | Скриптовые языки администрирования Windows | 17 | 24-01-2024 16:03 | |
Любой язык - [решено] Скрипт который раскидывает файлы по папкам, с частью имени этих файлов | 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 - [решено] Перемещение файлов из одной папки в разные в зависимости от имени файла | Sarge81 | Скриптовые языки администрирования Windows | 4 | 20-09-2011 04:20 |
|