Переход к содержимому файлу по lnk

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Аватара пользователя
prog_san
Сообщения: 285
Зарегистрирован: Сб сен 29, 2007 00:52
Откуда: Пенза

Переход к содержимому файлу по lnk

Сообщение prog_san »

Задача проста: необходимо в панели перейти в директорию с файлом, на который lnk создан. Желательно установить курсор на файл.

Решения не нашел.
Жду ваших советов и рекомендаций.
Errare humanum est
Аватара пользователя
CaptainFlint
Сообщения: 6239
Зарегистрирован: Вт дек 14, 2004 22:34
Контактная информация:

Сообщение CaptainFlint »

Если устраивает переход в соседней панели, то Ctrl+влево/вправо (или Ctrl+Shift+вверх для новой вкладки).
Почему же, ё-моё, ты нигде не пишешь "ё"?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

prog_san
Давненько делал себе скриптец (правда у себя с TCFS2 вместо %C_P% для скорости):

Код: Выделить всё

'================================= VBS =================================
' Перейти к исходному файлу символической ссылки или ярлыка под курсором
' Параметры: %V [/T]            (ключ /T — для открытия в новой вкладке)
'=======================================================================
If WSH.Arguments.Named.Exists("T") Then T = " /T"
LT = CreateObject("Shell.Application").NameSpace(0).ParseName(WSH.Arguments(0)).ExtendedProperty("LinkTarget")
If Not IsEmpty(LT) Then CreateObject("WScript.Shell").Exec "%COMMANDER_EXE% /A /O /S" & T & " """ & LT & """"
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Делал себе такой вариант на AutoHotkey

Код: Выделить всё

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
; Total Commander DreamLair                        ;
; Script: Goto path from shortcut                  ;
; Script version: 1.3 (2020.04.21)                 ;
; Script author: LonerD                            ;
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
; Parameter:                                       ;
;  1) %P%N (required)                              ;
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;

#NoEnv
#NoTrayIcon
#SingleInstance force

if not ( WinExist("ahk_class TTOTAL_CMD") || WinActive("ahk_class TTOTAL_CMD") )
  ExitApp
WinGet, hw_TTOTAL_CMD, ID, A

LnkPath = %1%
if !FileExist(LnkPath)
  ExitApp

SplitPath, LnkPath ,,, LnkExt
if ( LnkExt <> "lnk" )
  ExitApp

EnvGet, commander_exe, commander_exe

FileGetShortcut, % LnkPath, LnkPathGo

if FileExist(LnkPathGo)
  RunWait, % commander_exe " /O /S /A /L=" """" LnkPathGo """"
else
  ExitApp

if InStr(FileExist(LnkPathGo), "D")
  PostMessage, 1075, 2002,,, % "ahk_id " hw_TTOTAL_CMD

ExitApp
Последний раз редактировалось LonerD Вт апр 21, 2020 19:49, всего редактировалось 1 раз.
Windows 11 | TC DreamLair eternal pre-α
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Решил пару плюшек добавить помимо поддержки символических ссылок.
[cut="Может работать из следующих виртуальных папок:"]Рабочий стол
Администрирование
<Каталог пользователя>
Мои видеозаписи
Мои документы
Изображения
Моя музыка
Программы
Загрузки
Контакты
Избранное
Сохраненные игры
Ссылки
Общие
Общие видео
Общая музыка
Общие документы
Общие изображения
Общие загруженные файлы
Избранное (общ)
User Pinned
Programs Folder
Programs Folder and Fast Items
Common Places FS Folder
printhood delegate folder
delegate folder that appears in Computer
Библиотеки: Видео, Документы, Изображения, Музыка
[/cut]Может переходить к виртуальным папкам. Если на входе стоит mmc, то переходит к оснастке из параметра.

Код: Выделить всё

'================================== VBS ==================================
' Перейти к исходному объекту символической ссылки или ярлыка под курсором
' Параметры: %V [/R] [/T]         | /R — ключ для открытия в другой панели
'                                 | /T — ключ для открытия в новой вкладке
'==================================================== Автор: Flasher © ===
Option Explicit : Dim A, T, FSO, ShA, WSS, LT, PN, i, N, L
Set A = WSH.Arguments
If Right(A(0), 1) = "\" Then WSH.Quit
If A.Named.Exists("T") Then T = "/T "
If A.Named.Exists("R") Then T = T & "/R="
Set FSO = CreateObject("Scripting.FileSystemObject")
Set ShA = CreateObject("Shell.Application")
Set WSS = CreateObject("WScript.Shell")
If Left(A(0), 2) <> "\\" Then
  Set LT = ShA.NameSpace(0).ParseName(A(0))
Else  PN = FSO.GetParentFolderName(Mid(A(0), 3))
  For Each i in Array(0,5,46,47,53,54,55,"Profile","Public","Downloads","Programs",_
  "Links","My Video","My Pictures","My Music","Contacts","User Pinned","SavedGames",_
  "CommonDownloads","MusicLibrary","VideosLibrary","DocumentsLibrary","PicturesLibrary",_
  "::{7BE9D83C-A729-4D97-B5A7-1B7313C39E0A}","::{865E5E76-AD83-4DCA-A109-50DC2113CE9A}",_
  "::{D34A6CA6-62C2-4C34-8A7C-14709C1AD938}","::{323CA680-C24D-4099-B94D-446DD2D7249E}",_
  "::{ED50FC29-B964-48A9-AFB3-15EBB9B97F36}","::{B155BDF8-02F0-451E-9A26-AE317CFD7779}")
    If Not IsNumeric(i) Then i = "shell:" & i
    Set N = ShA.NameSpace(i) : If Not N Is Nothing Then _
    If PN = N Then Set LT = N.ParseName(FSO.GetFileName(Mid(A(0), 3))) : Exit For
  Next
  If Not IsObject(LT) Then Quit
End If
On Error Resume Next
If LT.IsLink And LCase(Right(A(0), 4)) = ".lnk" Then
  L = LT.GetLink.Target.Path
  If Err Then L = LT.ExtendedProperty("LinkTarget")
  If Left(L, 3) = "::{" Then
    Err.Clear : If ShA.NameSpace("shell:" & L) Is Nothing Then Quit
    If Err.Number Then Quit
  Else
    If Mid(L, 2, 2) <> ":\" Then Call Quit Else If Not Err Then _
    If FSO.GetFileName(L) = "mmc.exe" Then A = LT.GetLink.Arguments:_
    If Len(A) Then L = A End If : L = WSS.ExpandEnvironmentStrings(L)
    If FSO.FileExists(L) + FSO.FolderExists(L) = 0 Then Quit
  End If
Else L = LT.ExtendedProperty("LinkTarget") End If
If Not IsEmpty(L) Then WSS.Exec "%COMMANDER_EXE% /A /O /S " & T & """" & L & """"
Quit: Sub Quit: Set ShA = Nothing : Set FSO = Nothing : Set WSS = Nothing : WSH.Quit :End Sub
[cut="2LonerD"]

Код: Выделить всё

if not ( WinExist("ahk_class TTOTAL_CMD") || WinActive("ahk_class TTOTAL_CMD") )
  ExitApp
Не понимаю, зачем эти проверки, если и так ясно, окуда работа ведётся. Или были примеры, когда подобным скриптом начинают пользоваться не по назначению?

+ В 32 строке про ключ /A забыл, в то время как далее из папки предпочитаешь выходить, что в данном концепте считаю лишним.
Кстати, см. в соседней теме примеры, как фокусироваться из родителя.[/cut]
Последний раз редактировалось Flasher Пт апр 24, 2020 20:57, всего редактировалось 9 раз.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Flasher
Добавил /A.
Можно и без проверки в данном случае. На всякий случай добавляю в начале каждого скрипта. Мало ли, может ассоциации в системе на ahk-файлы, можно скрипт запустить вне Тотала и что-то нарушить. Про "фокусироваться из родителя" не очень понял - где и зачем.
Windows 11 | TC DreamLair eternal pre-α
Аватара пользователя
prog_san
Сообщения: 285
Зарегистрирован: Сб сен 29, 2007 00:52
Откуда: Пенза

Сообщение prog_san »

Спасибо!
Errare humanum est
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

LonerD
Ассоциация без разницы где. А запускать скрипт вне ТС, взяв его с форума ТС, как минимум глупо. Фокусировка касалась выхода из папки, который на AHK легко заменяется более приятным поведением.


prog_san
См. обнову. Я там ещё пачку виртуальных папок добавил.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
HEXFIX
Сообщения: 177
Зарегистрирован: Пт июн 25, 2010 19:54
Откуда: Калининград

Сообщение HEXFIX »

Flasher
А можно как-то сделать переход к источнику от линка, который создан от имени другого пользователя (администратора)?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

HEXFIX
А для линка есть разница, кем он был создан? Каков источник проблемы?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
HEXFIX
Сообщения: 177
Зарегистрирован: Пт июн 25, 2010 19:54
Откуда: Калининград

Сообщение HEXFIX »

В виртуальной папке Рабочий стол отображаются все ярлыки на собственно Рабочем столе. Часть из них находится в папке Рабочий стол моего профиля — с ними никаким проблем нет, скрипт работает, другая часть находится в папке Рабочий стол профиля Общие и тут использование скрипта выдаёт такую ошибку:

Код: Выделить всё

Cтрока:29
Символ:5
Ошибка: Разрешение отклонено
Код: 800A0046
Проверял на ярлыках из виртуальной папки Рабочий стол и из Рабочего стола Общего профиля непосредственно
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

HEXFIX
Так а при чём здесь создание от имени другого пользователя? В Общих ярлыки могут появляться при установке программ любым юзером с годным правами. Никаких проблем с объектами, ведущими в общие папки нет. Я бы это сразу заметил ещё до первой редакции. Кстати, ошибка явно из какой-то прежней версии. Я там кое-что добавлял и причёсывал (сейчас тоже немного).
С виртуальной папкой проблем быть не должно. А для обращения из локальной папки в Общих нужно повышение прав. Т. е. ТС надо запускать от админа (включая AlwaysAsAdmin=1 в конфиге).
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
HEXFIX
Сообщения: 177
Зарегистрирован: Пт июн 25, 2010 19:54
Откуда: Калининград

Сообщение HEXFIX »

А почему тогда Ctrl+ стрелки работают на таких ярлыках в ТС, запущенном с обычными правами?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

HEXFIX
Из виртуальных папок Ctrl + ⇄ в ТС запрошенным образом не работает на любых ярлыках.
Как TС взаимодействует с API, мне не ведомо, но уж точно не через свойство GetLink. ;)
В общем, поправил для перехода оттуда по обычным путям. Для входа в виртуальные папки уже нужны будут права, но и ругательное окно появляться не будет.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
HEXFIX
Сообщения: 177
Зарегистрирован: Пт июн 25, 2010 19:54
Откуда: Калининград

Сообщение HEXFIX »

Я имел ввиду, что Ctrl + <> отрабатывает в Общих. Про виртуальные папки понятно, в них не работает, собственно поэтому мне этот скрипт и нужен.

Теперь скрипт работает. И из виртуальных папках на проблемных линках. И никаких прав не требует :wink:

А можно реализовать открытие в другой панели? Т.е. также, как это Ctrl + <> делают?
Ответить