|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Выделить подстроки из текстового файла и записать их в пару переменных |
|
CMD/BAT - Выделить подстроки из текстового файла и записать их в пару переменных
|
Новый участник Сообщения: 6 |
Профиль | Отправить PM | Цитировать
Привет.
Возникла задача, связанная с обработкой текстового файла. Предыстория в следующих двух абзацах. Её можно пропустить. Фонотека на дисках USB HDD структурирована определённым образом. В ней используются точки соединения - JUNCTION. Изначально предполагалось работать с этими дисками, монтируя тома каждый раз на букву “H:”. Однако, спустя время, с монтированием заморачиваться поднадоело. И для этого в файловой системе NTFS появились относительные символьные ссылки – SYMLINKD. Процедура замены JUNCTION на SYMLINKD понятна. Для этого есть соответствующая команда NTLinks Maker http://wincmd.ru/plugring/NTLinksMaker.html . Также понятно, как вывалить информацию обо всех JUNCTION в файл: @chcp 1251 >nul dir /AL /S H:\ >JtoS.txt В итоге файл JtoS.txt содержит регулярную структуру данных. Например: Том в устройстве H имеет метку 2 NTFS Серийный номер тома: CAE4-9F0A Содержимое папки H:\Слушать\Слушать\ Инструменты\Труба (trumpet) 09.12.2010 23:43 <JUNCTION> Baldauf Rudiger [\??\H:\Фонотека\Jazz - fusion\Baldauf Rudiger] 29.10.2011 02:21 <JUNCTION> Beiderbecke Leon Bix [\??\h:\Фонотека\Jazz\Beiderbecke Leon Bix] ... 0 файлов 0 байт ... Содержимое папки H:\Слушать\Слушать\Modern jazz 09.10.2010 08:28 <JUNCTION> Lloyd Charles [\??\H:\Фонотека\Jazz - avant-guard\Lloyd Charles] 0 файлов 0 байт Содержимое папки H:\Слушать\Слушать\Smooth 23.08.2010 21:29 <JUNCTION> Blake Aaron - Desire (2007) [\??\H:\Фонотека\Jazz - smooth\Aaron Blake\Blake Aaron - Desire (2007)] 02.09.2010 18:56 <JUNCTION> Club des Belugas - Swop (2008) [\??\H:\Фонотека\Jazz - smooth\ Various\Club des Belugas - Swop (2008)] ... 0 файлов 0 байт Всего файлов: 1 файлов 0 байт 665 папок 316*940*726*272 байт свободно Формально нужно организовать цикл по секциям, начинающимся со строк “Содержимое папки”. В каждой секции пройти по строкам, содержащим “<JUNCTION>”, каждый раз в переменную %t помещая содержимое квадратных скобок без символов “\??\” (целевой объект), а в переменную %l – ссылку. Для первого вхождения: %t = “H:\Фонотека\Jazz - fusion\Baldauf Rudiger”, %l = “H:\Слушать\Слушать\ Инструменты\Труба (trumpet)\Baldauf Rudiger”. Для второго вхождения: %t = “h:\Фонотека\Jazz\Beiderbecke Leon Bix”, %l = “H:\Слушать\Слушать\ Инструменты\Труба (trumpet)\Beiderbecke Leon Bix”. и т.д. %t лежит внутри “[\??\ ... ]”. %l образуется конкатенацией строки, стоящей следом за “Содержимое папки” , бэк-слеша и строки, стоящей между “<JUNCTION>” и строкой ”[\??\“ без лидирующих и замыкающих пробелов. В именах файлов, кроме русских букв, могут встречаться спецсимволы (,;:_ и т.п.). Помогите, плиз, с шаблоном обработки. Саму процедуру замены с удалением JUNCTION и созданием SYMLINKD вставлю в шаблон самостоятельно. Спасибо заранее. |
|
Отправлено: 11:16, 27-01-2022 |
fascinating rhythm Сообщения: 6491
|
Профиль | Отправить PM | Цитировать Цитата HankHank:
|
|
------- Отправлено: 15:52, 28-01-2022 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать Цитата HankHank:
Попытаюсь:
Дело в отложенном раскрытии переменных командной строки.
Вот примеры. Проделайте, проанализируйте. Все эти махинации нужны, чтобы в цикле можно было использовать изменяемые значения переменных. В 111111 Call не применяли, в результате имеем значение Junk до цикла. В 222222 используем Call для раскрытия значения переменной внутри цикла, а в 333333 работаем с переменной Junk внутри вызываемой в цикле процедуры. В 444444 применяем SetLocal EnableDelayedExpansion для раск для раскрытия значения переменной внутри цикла. Там переменная заключается в знаки !Junk! При этом возможны неприятности: если в значении переменной присутствует !, то получим непредсказуеый результат. @Echo Off cls Echo. &Echo ----- 111111 Без Call Set "Junk=" For /L %%i In (100001,100000,400000) Do ( Set "Junk=%%i" Set "Junk=%Junk:~0,-1%" Echo i=%%i Junk="%Junk%" ) Echo "%Junk%" Echo. &Echo ----- 222222 C Call Set "Junk=" For /L %%i In (100001,100000,400000) Do ( Set "Junk=%%i" Call Set "Junk=%%Junk:~0,-1%%" Call Echo i=%%i Junk="%%Junk%%" ) Echo "%Junk%" Echo. &Echo ----- 333333 C процедурой Set "Junk=" For /L %%i In (100001,100000,400000) Do Call :MyEcho %%i Echo "%Junk%" Echo. &Echo ----- 444444 SetLocal EnableDelayedExpansion SetLocal EnableDelayedExpansion Set "Junk=" For /L %%i In (100001,100000,400000) Do ( Set "Junk=%%i" Set "Junk=!Junk:~0,-1!" Echo i=%%i Junk="!Junk!" ) Echo "%Junk%" SetLocal DisableDelayedExpansion Pause Exit /B :MyEcho Set "Junk=%1" Set "Junk=%Junk:~0,-1%" Echo i=%1 Junk="%Junk%" Exit /B |
|
------- Отправлено: 18:18, 28-01-2022 | #12 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - Записать название файла в начало текстового файла | krambrige | Скриптовые языки администрирования Windows | 3 | 15-12-2018 17:23 | |
CMD/BAT - [решено] Обработка получаемых переменных из текстового файла | alexxx2011 | Скриптовые языки администрирования Windows | 2 | 14-12-2017 15:54 | |
Любой язык - Записать информацию о пользователях в AD из текстового файла. | dasgespenst | Скриптовые языки администрирования Windows | 2 | 29-07-2014 09:53 | |
CMD/BAT - [решено] Выделить из текстового файла строки, содеражщие дату формата DD.MM.YYYY за указанный | jrd | Скриптовые языки администрирования Windows | 2 | 17-02-2012 16:57 | |
Неправильно отображаются данные при вводе их из текстового файла! | Sox | Программирование и базы данных | 3 | 08-03-2006 17:23 |
|