Total Commander Knowledge Base

Есть вопрос?

Поищите ответ в самой большой русскоязычной базе знаний по Total Commander!

Переход по указанному в буфере обмена пути или ключу реестра

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

  • Если в пути к отсутствующему каталогу/файлу имеются оба варианта косой черты, то объектом для перехода станет родительский каталог.
  • Разделы реестра могут быть записаны в т. ч. в виде аббревиатур (HKCU, HKCR, HKLM, HKCC, HCU) в любом регистре и иметь ':' на конце.
  • Если указан параметр или несуществующий ключ реестра, произойдёт переход в существующий в путевой цепи куст.
  • Разделителем в путевой цепи может быть прямой или обратный слэш, в т. ч. с лишними пробелами по обе стороны.
  • Могут быть указаны лишние концевые пробелы, знаки табуляции, переводы строк, кавычки, квадратные скобки.
  • Поддерживаются длинные пути (более 259 символов), относительные пути и пути с переменными окружения.
  • В цепочке относительного пути на наличие также проверяются все составные компоненты.
  • Запрещённые символы в конце путей файлов и каталогов отсекаются.
  • Виртуальный каталог может открываться по {GUID} или ::{GUID}.
A: VBS-скрипт (описание работы в шапке):
'=============================== VBS ==============================
' Назначение: Перейти к объекту в активной панели ТС по указанному
'             в буфере имени файла/каталога, ключу реестра или GUID

' Условие:   указать %$SystemX86%\wscript.exe перед путём к скрипту

' Параметры: "<имя плагина реестра в папке Сеть/FS-плагины>" "%P%Z"
'============================================= Автор: Flasher © ===
Option Explicit : Dim FSO, C, REx, R
If WSH.Arguments.Count <> 2 Then MsgBox "Укажите два параметра!",_
4144, " Переход по пути в панели ТС" : WSH.Quit
Set FSO = CreateObject("Scripting.FileSystemObject")
With GetObject("New:1C3B4210-F441-11CE-B9EA-00AA006B1A69)")
  .GetFromClipboard : If Not .GetFormat(1) Then Quit 1
  C = .GetText : If Len(C) = 0 Then Quit 0
End With : Set REx = New RegExp
With REx
  .IgnoreCase = 1
  .Pattern = "(H[CK]|(::)?\{|%|[A-Z]:)[^\r\n""]+[^\s\\""]"
  If .Test(C) Then
    C = .Execute(C)(0)
  Else .Pattern = " *[^\s/|:\\<*?>""][^\r\n\t|:<*?>""]*"
    If .Test(C) Then C = RTrim(.Execute(C)(0)) Else Quit 1
  End If : .Pattern = "^(::)?\{"
End With
C = Replace(Replace(C, " \ ", "\"), " / ", "/")

With CreateObject("WScript.Shell")
  If InStr(1, "|HK|HC|", "|" & Left(C, 2) & "|", 1) Then
    If Right(C, 1) =  "]" Then C = Left(C, Len(C) - 1)
    R = InStr(C, ":") : If R = 4 Or R = 5 Then _
    C = Left(C, R - 1) & Mid(C, R + 1)
    C = FSO.BuildPath(Replace(C, "/", "\"), "\")
    Select Case UCase(Left(C, InStr(C,"\") - 1))
      Case "HKCU" C = "HKEY_CURRENT_USER"   & Mid(C, 5)
      Case "HKLM" C = "HKEY_LOCAL_MACHINE"  & Mid(C, 5)
      Case "HKCR" C = "HKEY_CLASSES_ROOT"   & Mid(C, 5)
      Case "HKCC" C = "HKEY_CURRENT_CONFIG" & Mid(C, 5)
      Case "HKU"  C = "HKEY_USERS" & Mid(C, 4)
    End Select : On Error Resume Next : .RegRead(C)
    Do Until Err.Number = 0
      On Error Goto 0
      If InStr(C, "\") = Len(C) Then Exit Do
      C = FSO.GetParentFolderName(C) & "\"
      On Error Resume Next : .RegRead(C)
    Loop : C = "\\\" & WSH.Arguments(0) & "\" & C
  ElseIf Not REx.Test(C) Then
    REx.Pattern = "^(%|[A-Z]:)?[^:?*<|>]+"
    If REx.Test(C) Then C = .ExpandEnvironmentStrings(REx.Execute(C)(0)) Else Quit 1
    REx.Pattern = ".+/.+\\.+|.+\\.+/.+" : If REx.Test(C) Then _
    REx.Pattern = "(.+)[\\/][^\\/]+[\\/]?$" :_
    If REx.Test(C) Then Set C = REx.Execute(C)(0) :_
    If FSO.FolderExists("\\?\" & C) + FSO.FileExists("\\?\" & C) = 0 Then C = C.Submatches(0)
    If Mid(C, 2, 1) <> ":" Then
      C = WSH.Arguments(1) & C
      If FSO.FileExists("\\?\" & C) + FSO.FolderExists("\\?\" & C) = 0 Then
        For R = 3 To UBound(Split(Replace(C, "/", "\"), "\"))
          If FSO.FolderExists("\\?\" & C) Then R = 0 : Exit For Else C = FSO.GetParentFolderName(C)
        Next : If R Then Quit 1
      End If
    End If
    If FSO.FolderExists("\\?\" & C) + FSO.FileExists("\\?\" & C) = 0 Then Quit 1
  Else On Error Resume Next
    If Left(C, 1) = "{" Then C = "::" & C
    If CreateObject("Shell.Application").NameSpace("shell:" & C) Is Nothing Then Quit 1
    If Err Then Quit 1
  End If
  If StrComp(FSO.BuildPath(C, "\"), WSH.Arguments(1), 1) = 0 Then Quit 0
  .SendKeys "^{F10}" : .Run """%COMMANDER_EXE%"" /A /O /S """ & C & """" : Quit 0
End With

Sub Quit(T)
  If T Then MsgBox "Содержимое буфера обмена не эквивалентно" & vbCr &_
  "существующему пути в системе или реестре !", 4144, " Переход по пути в панели ТС"
  Set FSO = Nothing : WSH.Quit
End Sub

Flasher
02.01.2020