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

Материал из TCKB 2.0
Перейти к:навигация, поиск
Q: Задача в необходимости перехода к файлу, папке или ключу реестра, указанному в буфере обмена по имени или пути.

• Если указан параметр или несуществующий ключ реестра, произойдёт переход в существующий в путевой цепи куст.
• Разделителем в путевой цепи может быть прямой или обратный слэш, в т. ч. с лишними пробелами по обе стороны.
• Могут быть указаны лишние концевые пробелы, знаки табуляции, переводы строк, кавычки, квадратные скобки.
• Разделы реестра могут быть записаны в т. ч. в виде аббревиатур: HKCU, HKCR, HKLM, HKCC, HCU.
• Виртуальный каталог может открываться по {GUID} или ::{GUID}.

• Поддерживаются пути с переменными окружения.
A: VBS-скрипт (описание работы в шапке):
'=============================== VBS ==============================
' Назначение: Перейти к объекту в активной панели ТС по указанному
'             в буфере имени файла/каталога, ключу реестра или GUID

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

' Параметр: "<название плагина реестра в панели Сеть/FS-плагины>"
'============================================= Автор: Flasher © ===
Option Explicit : Dim FSO, C, REx, P
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
  .Pattern = "((::)?\{|%|[A-Za-z]:|H[CK])[^\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("|HK|HC|", "|" & Left(C, 2) & "|") Then
    If Right(C, 1) =  "]" Then C = Left(C, Len(C) - 1)
    C = FSO.BuildPath(Replace(C, "/", "\"), "\")
    Select Case 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 "HCU"  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
  Else If Not REx.Test(C) Then _
    C = FSO.GetAbsolutePathName(.ExpandEnvironmentStrings(C)) : P = C :_
    Else If Left(C, 1) = "{" Then C = "::" & C End If : P = "shell:" & C
    If Not FSO.FileExists(C) Then _
    If CreateObject("Shell.Application").NameSpace(P) Is Nothing Then Quit 1
  End If : .Run """%COMMANDER_EXE%"" /A /O /S """ & C & """" : Quit 0
End With

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

Flasher
02.01.2020