Поменять Junction на относительные символьные ссылки
Select messages from
# through # FAQ
[/[Print]\]

Total Commander -> Автоматизация Total Commander

#1: Поменять Junction на относительные символьные ссылки Author: HankHank PostPosted: Wed Jan 26, 2022 00:20
    —
Доброго времени суток.

Есть фонотека на нескольких USB HDD, которой не один десяток лет.
В ней в изобилии используются точки соединения (Junction). Так было легче структурировать музыку.
Изначально предполагалось работать с этими дисками, монтируя их каждый раз на букву “H:”.
Однако, надоело заморачиваться с монтированием.

Может, кто-то сталкивался с подобной задачей.
Хотелось бы найти способ автоматизировать замену точек соединения на относительные символьные ссылки.
Всё равно, с помощью TC или как-то иначе.

Спасибо.

#2:  Author: HankHank PostPosted: Wed Jan 26, 2022 16:22
    —
Найти все точки соединения в TC понятно, как:
Поиск файлов – вкладка Плагины.

У меня есть оба-два плагина: ntlinks и nl_info.
По обоим поиск получается.

В ntlinks: Тип объекта = Точка соединения
В nl_info: Тип символической ссылки (расш) = Junction

Можно получить простыню с интересующими ссылками из комстроки:
dir /AL /S H:\ | find "JUNCTION"

Что дальше делать?
Руками всё лопатить немыслимо.

По смыслу осталось совсем чуть-чуть: ))
Взять Реальный путь и Целевой объект.
Аккуратно удалить существующую Junction.
Создать Относительную символьную ссылку, используя Целевой объект и Реальный путь.
Выполнить цикл по всему диску.

Posted after 1 hour 54 minutes:

Помимо NTLinks Maker http://wincmd.ru/plugring/NTLinksMaker.html
существует утилита Руссиновича
https://docs.microsoft.com/ru-ru/sysinternals/downloads/junction .

Для получения Рального пути ей в качестве параметра надо подсунуть найденную точку соединения:
junction.exe <junction directory>

Вот так (ещё один способ, 4-ый) можно организовать рекурсивный вывод всех точек соединения из текущей папки:
junction.exe –s .

А так можно аккуратно удалять точки соединения:
junction.exe -d <junction directory>

Осталось объединить NTLinks Maker, утилиту Руссиновича и соорудить скрипт в командном процессоре...
В этом я не силён. ((

#3: Формализованная задача Author: HankHank PostPosted: Thu Jan 27, 2022 16:03
    —
Задача формализована.

На томе содержатся исключительно JUNCTION, созданные одним и тем же плагином. Вид их одинаков.
Информация обо всех JUNCTION вываливается в файл:

dir /AL /S H:\ >JtoS.txt

В итоге JtoS.txt содержит регулярную структуру данных. Например:

Code:

 Том в устройстве 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 понятна. Для этого есть соответствующая команда NTLinks Maker. Есть ещё и штатная команда MKLINK /D ...

Требуется, по возможности, помощь в шаблоне обработки.
Процедура замены с удалением JUNCTION и созданием SYMLINKD вставляется в шаблон без особых хлопот.

#4:  Author: HankHank PostPosted: Thu Jan 27, 2022 22:25
    —
Код для скрипта может быть ещё проще, если использовать команду

DIR /AL /B /S H:\

Тогда получим строки с полными путями к ссылкам:

Code:

H:\Слушать\Слушать\Albright Gerald
H:\Слушать\Слушать\Alex Rostotsky - Time when fish think of the past (2004)
H:\Слушать\Слушать\Dave Brubeck - Ken Burns Jazz (Columbia - Legacy Records) 2000
H:\Слушать\Слушать\Dino Saluzzi - El Encuentro (2010) [Flac]
H:\Слушать\Слушать\Modern Jazz Quartet - Live At The Lighthouse (MFSL MFCD 827) (1967)



А, еcли вызвать FSUTIL, указав ему ссылку, то получим список строк, в котором нас интересует “Print Name:”.

Например:

FSUTIL reparsepoint query “H:\Слушать\Слушать\Alex Rostotsky - Time when fish think of the past (2004)”

Code:

Reparse Tag Value : 0xa0000003
Tag value: Microsoft
Tag value: Name Surrogate
Tag value: Mount Point
Substitue Name offset: 0
Substitue Name length: 184
Print Name offset:     186
Print Name Length:     176
Substitute Name:       \??\h:\Фонотека\Jazz\Rostotsky Alex\Alex Rostotsky - Time when fish think of the past (2004)
Print Name:            h:\Фонотека\Jazz\Rostotsky Alex\Alex Rostotsky - Time when fish think of the past (2004)



Т.о., проблемы со спецсимволами в именах папок сокращаются.

#5:  Author: MVVLocation: Ростов-Дон PostPosted: Fri Jan 28, 2022 09:50
    —
На самом деле, Substitute Name важнее, т.к. именно оно идентифицирует цель, в то время как Print Name предназначено только для визуальной идентификации цели (префикс только откусить надо):
https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/ca069dad-ed16-42aa-b057-b6b207f447cc

А для создания относительной ссылки должна работать такая команда (при запуске от администратора):
Code:
NTLinksMaker.exe /q /sr /n <src_path> <link_path>

#6: Тема исчерпана Author: HankHank PostPosted: Sun Jan 30, 2022 17:26
    —
Решение задачи нашлось быстрее, чем предполагалось изначально.
Сердечная благодарность коллегам за неформальное и оперативное участие.

Удачи всем нам!

#7:  Author: MVVLocation: Ростов-Дон PostPosted: Fri Feb 04, 2022 15:32
    —
Предлагаю поделиться окончательным вариантом решения, авось кому еще пригодится.



Total Commander -> Автоматизация Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Page 1 of 1

Powered by phpBB © 2001, 2005 phpBB Group