Выделить подстроки из текстового файла и записать их в пару переменных
Привет.
Возникла задача, связанная с обработкой текстового файла. Предыстория в следующих двух абзацах. Её можно пропустить. Фонотека на дисках 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 Формально нужно организовать цикл по секциям, начинающимся со строк “Содержимое папки”. В каждой секции пройти по строкам, содержащим “<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 вставлю в шаблон самостоятельно. Спасибо заранее. |
Не думаю, что эта задача может быть надежно реализована в CMD из-за спецсимволов. Попробуйте формальное решение:
Код:
@Echo Off |
Powershell:
Код:
$strNum = ((gc "D:\temp\JtoS.txt" -OutVariable txt |sls 'Содержимое папки').LineNumber|% {$_ - 1}) Код:
$report |
HankHank, Не думаю, что хорошая идея копаться в файле. А почему бы сразу не обрабатывать вывод Dir?
Код:
@Echo Off |
Код для скрипта может быть проще, если использовать команду
DIR /AL /B /S H:\ Тогда получим чистые строки с полными путями к ссылкам: Код:
H:\Слушать\Слушать\Albright Gerald Например: FSUTIL reparsepoint query “H:\Слушать\Слушать\Alex Rostotsky - Time when fish think of the past (2004)” Код:
Reparse Tag Value : 0xa0000003 Мне кажется, при таком раскладе шаблон для CMD вполне должен прокатить. |
Цитата:
После чего брать из файла мелкие порции и отладить скрипт. Засада ожидается с русскими символами и спецсимволами. А уже большими частями обработать всё оставшееся безобразие. |
Цитата:
Берите скрипт с непосредственной обработкой Dir и натравливайте его на небольшую папку. :) |
Цитата:
Только обходить вручную весь диск - не лучшая идея. Плоская "простыня" кажется удобнее. |
Цитата:
Set "BoxIn=H:\Слушать\Слушать\Modern jazz\" или более обьемную: Set "BoxIn=H:\Слушать\Слушать\" и добейтесь в отладке полного счастья. Но отлаживать по любому надо скрипт, который собрались применять. |
У меня начальные познания о командных файлах. Но CALL-оператор, вроде, вызывает внешний комфайл или передаёт управление внутри того же файла.
Подскажите, в чём фишка употребления CALL в сочетании с другими операторами типа: Цитата:
|
Цитата:
|
Цитата:
Попытаюсь:
Дело в отложенном раскрытии переменных командной строки.
Вот примеры. Проделайте, проанализируйте. Все эти махинации нужны, чтобы в цикле можно было использовать изменяемые значения переменных. В 111111 Call не применяли, в результате имеем значение Junk до цикла. В 222222 используем Call для раскрытия значения переменной внутри цикла, а в 333333 работаем с переменной Junk внутри вызываемой в цикле процедуры. В 444444 применяем SetLocal EnableDelayedExpansion для раск для раскрытия значения переменной внутри цикла. Там переменная заключается в знаки !Junk! При этом возможны неприятности: если в значении переменной присутствует !, то получим непредсказуеый результат. Код:
@Echo Off |
Время: 04:42. |
Время: 04:42.
© OSzone.net 2001-