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

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

Ответить
Настройки темы
CMD/BAT - Выделить подстроки из текстового файла и записать их в пару переменных

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


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

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


Изменения
Автор: HankHank
Дата: 27-01-2022
Привет.

Возникла задача, связанная с обработкой текстового файла.

Предыстория в следующих двух абзацах. Её можно пропустить.

Фонотека на дисках 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

 

Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Цитата HankHank:
У меня начальные познания о командных файлах »
Переходите на Powershell тогда лучше сразу. Там решена масса проблем CMD.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

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

Отправлено: 15:52, 28-01-2022 | #11



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

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


Ветеран


Contributor


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

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


Цитата HankHank:
Подскажите, в чём фишка употребления CALL в сочетании с другими операторами »
Попытаюсь:
Дело в отложенном раскрытии переменных командной строки.
Вот примеры. Проделайте, проанализируйте. Все эти махинации нужны, чтобы в цикле можно было использовать изменяемые значения переменных.
В 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
Аналогичные проблемы при работе с переменными внутри If

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

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

Отправлено: 18:18, 28-01-2022 | #12



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход