Использование контекстного меню Проводника для копирования измененной версии пути к файлу в буфер обмена

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

Требование

У меня есть файлы, синхронизированные между моим ПК и моим веб-сервером. По сути, мне нужно иметь возможность щелкнуть правой кнопкой мыши локальный файл и скопировать эквивалентный путь к серверу (с некоторой дополнительной логикой манипулирования строками) в буфер обмена.

Подход

Я предполагаю, что мне нужно сделать следующее:

  1. Добавьте параметр контекстного меню проводника Windows для выполнения сценария WSH, передавая в качестве параметра полный путь и имя файла.
  2. Создайте сценарий Windows Scripting Host, который будет принимать этот параметр, выполнять необходимые манипуляции со строками и копировать в буфер обмена.

С манипуляциями со строками я справляюсь нормально (желательно на VBScript). Это вся передача параметра сценарию WSH, о котором я не могу найти никакой информации.

С другой стороны, я был бы не против, если бы это было сделано с помощью PowerShell (если применимо), чтобы я мог узнать об этом немного больше, пока я этим занимаюсь.

Спасибо заранее.


person AndyCNX    schedule 07.02.2012    source источник
comment
Я ответил на вопрос ниже.   -  person AndyCNX    schedule 08.02.2012


Ответы (4)


Вы можете получить доступ к параметру в сценарии VB таким образом:

WScript.Echo(WScript.Arguments(0))

Когда вы регистрируете команду контекстного меню оболочки, вы можете передать путь и имя файла в качестве параметра, зарегистрировав:

wscript.exe "C:\...full path...\myscript.vbs" "%1"
person arx    schedule 07.02.2012
comment
Это не совсем сработало. Я использовал следующее, и теперь все в порядке: wscript.exe "[fullpath]\myscript.vbs" "%1" Добавил это к значению по умолчанию в этом ключе реестра: HKEY_CLASSES_ROOT\*\shell\Copy Server Path\Command Теперь просто пишу vbs-скрипт (я опубликую его позже для всех, кому это может понадобиться). - person AndyCNX; 08.02.2012

Хорошо, я изменил сценарий VBS, который регистрируется в контекстном меню проводника и позволяет вам щелкнуть правой кнопкой мыши файл, чтобы скопировать соответствующий URL-адрес сервера в буфер обмена.

'####################################################################
' If you sync files between your local PC and a web server you can use this
' script to right-click on one of those files to copy the corresponding server
' URL to your clipboard
'####################################################################
Option Explicit

'Local path to the directory that is being synchronised with the server
Const constRootWinPath = "C:\SyncedFiles"
'path to corresponding directory on the server
Const constRootServerPath = "/SyncedFiles/"
'Domain name of the server
Const constServerDomain = "http://mydomain.dom/"
'MAKE SURE TO INCLUDE LEADING AND TRAILING SLASHES ON ALL PATHS!!!!!

Dim objIE

' Parse the command line arguments
If WScript.Arguments.Count      <> 1 Then Syntax
If WScript.Arguments.Named.Count = 1 Then
    If WScript.Arguments.Named.Exists( "Register" ) Then
        Register
    ElseIf WScript.Arguments.Named.Exists( "Unregister" ) Then
        UnRegister
    Else
        Syntax
    End If
End If

' Check arguments. Text argument gets processed as a path. 
If WScript.Arguments.UnNamed.Count = 1 Then

    Dim strArgument
    strArgument = WScript.Arguments.Unnamed(0)

    'The file has to exist within a directory under constRootWinPath so that we know how to process the path
    If instr(trim(strArgument),trim(constRootWinPath)) > 0 Then
        'WScript.Echo """" & constRootWinPath & """ was found in """ & strArgument & """"
        SendToClipboard(ProcessLocalPathToServerPath(WScript.Arguments.Unnamed(0)))
    Else
        WScript.Echo """" & constRootWinPath & """ not found in """ & strArgument & """. Please make sure to edit the Const in the VBS file"
    End If
End If


Function ProcessLocalPathToServerPath(strLocalPath)
    Dim strProcessedPath, strFileName, strRelPathToRoot, strFileExtension

    'Get the filename
    strFileName = right(strLocalPath,len(strLocalPath)-InStrRev(strLocalPath,"\"))
    'WScript.Echo "strFileName: """ & strFileName & """"

    'Get the relative path to the root
    strRelPathToRoot = mid(strLocalPath,len(constRootWinPath),len(strLocalPath)-(len(constRootWinPath)+len(strFileName))+1) '+1 to get the trailing slash
    'Swap back slash for forward slash
    strRelPathToRoot = replace(strRelPathToRoot,"\","/")
    'WScript.Echo "strRelPathToRoot: """ & strRelPathToRoot & """"

    'Get the file extension
    strFileExtension = right(strFileName,len(strFileName)-InStrRev(strFileName,"."))
    'WScript.Echo "strFileExtension: """ & strFileExtension & """"

    'Process the paths depending on file type
    Select Case strFileExtension
        'send swf files to our wrapper viewer on the server
        Case "swf"
            strProcessedPath = constServerDomain & "flashviewer.asp?swf=" & constRootServerPath & strRelPathToRoot & strFileName
        'Use google viewer for supported file types
        Case "docx","doc","xls","xlsx","ppt","pptx","pdf","pages","ai","psd","tiff","dxf","svg","eps","ps","ttf","xps","zip","rar"
            strProcessedPath = "http://docs.google.com/viewer?url=" & constServerDomain & constRootServerPath & strRelPathToRoot & strFileName
        'direct file path
        Case else
            strProcessedPath = constServerDomain & constRootServerPath & strRelPathToRoot & strFileName
    End Select
    'WScript.Echo "strProcessedPath: """ & strProcessedPath & """"

    ProcessLocalPathToServerPath = strProcessedPath
End Function

' The Internet Explorer object is used, because WSH
' and VBScript don't support clipboard access by themselves.
Sub SendToClipboard(strToClipboard)
    Set objIE = CreateObject( "InternetExplorer.Application" )
    objIE.Navigate( "about:blank" )
    objIE.Document.ParentWindow.ClipboardData.SetData "text", strToClipboard
    objIE.Quit
    Set objIE = Nothing
End Sub 

Sub Register
    Dim wshShell

    Set wshShell = CreateObject( "WScript.Shell" )

    On Error Resume Next

    ' Add the required registry entries for files
    wshShell.RegWrite "HKEY_CLASSES_ROOT\*\shell\webists_serverpathtoclip\", "Copy Sever URL"
    wshShell.RegWrite "HKEY_CLASSES_ROOT\*\shell\webists_serverpathtoclip\command\", "wscript.exe """ & WScript.ScriptFullName & """ ""%L""", "REG_EXPAND_SZ"

    On Error Goto 0

    Set wshShell = Nothing
    WScript.Echo "Script successfully registered."
    WScript.Quit 0
End Sub


Sub UnRegister
    Dim wshShell

    Set wshShell = CreateObject( "WScript.Shell" )

    On Error Resume Next

    ' Remove the registry entries for the files menu
    wshShell.RegDelete "HKEY_CLASSES_ROOT\*\shell\webists_serverpathtoclip\command\"
    wshShell.RegDelete "HKEY_CLASSES_ROOT\*\shell\webists_serverpathtoclip\"

    ' Remove the registry entries for the folders menu
    ' wshShell.RegDelete "HKEY_CLASSES_ROOT\Folder\shell\webists_serverpathtoclip\command\"
    ' wshShell.RegDelete "HKEY_CLASSES_ROOT\Folder\shell\webists_serverpathtoclip\"

    On Error Goto 0

    Set wshShell = Nothing
    WScript.Echo "Script successfully unregistered."
    WScript.Quit 0
End Sub


Sub Syntax
    Dim strMsg
    strMsg = "Webists_GetCorrespondingServerPath.vbs,  Version 1.00" & vbCrLf _
           & "written by Andy Brennenstuhl @ The Webists" & vbCrLf _
           & "http://www.thewebists.com" & vbCrLf & vbCrLf _           
           & "Use this script to get corresponding server paths of synchronised files." & vbCrLf & vbCrLf _
           & "MAKE SURE TO CONFIGURE BY EDITING CONST VALUES IN THE SCRIPT." & vbCrLf & vbCrLf _
           & "Usage:  WSCRIPT  Webists_GetCorrespondingServerPath.vbs  ""text string"" | /Register | /Unregister" & vbCrLf & vbCrLf _
           & "Where:  ""text string""   is the full local path of the files you want to get the URL for" & vbCrLf _
           & "  /Register   Adds an entry ""Copy Webists Viewer Path"" to Explorers' context menu" & vbCrLf _
           & "  /UnRegister   Removes the menu entry again" _
           & vbCrLf & vbCrLf _
           & "Based on 'SendClip.vbs' Written by Rob van der Woude" & vbCrLf _
           & "http://www.robvanderwoude.com"
    WScript.Echo strMsg
    WScript.Quit 1
End Sub

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

Может ли кто-нибудь предложить лучший подход?

Sub SendToClipboard(strToClipboard)
    Set objIE = CreateObject( "InternetExplorer.Application" )
    objIE.Navigate( "about:blank" )
    objIE.Document.ParentWindow.ClipboardData.SetData "text", strToClipboard
    objIE.Quit
    Set objIE = Nothing
End Sub 
person AndyCNX    schedule 08.02.2012

Извините, что на французском, но я могу взять на себя перевод некоторых частей, если вам интересно. Год назад я написал статью под названием Контекстное меню «Полная оболочка PowerShell» в проводнике Windows, что можно перевести как «полное контекстное меню PowerShell в проводнике Windows». Конкретный данный образец представляет собой хэш-вычисление файла MD5.

person JPBlanc    schedule 07.02.2012
comment
Спасибо, но я уже начал работать над решением с использованием WSH. - person AndyCNX; 08.02.2012

Нет необходимости использовать какой-либо скрипт вообще

установите значение по умолчанию для ключа HKEY_CLASSES_ROOT*\shell\Copy Server Path\Command на: cmd.exe /c echo "%1"|clip

Работа сделана... Хорошего дня PS Я получил это от http://www.askvg.com/registry-tweak-to-add-copy-as-path-option-in-files-and-folders-context-menu-in-windows/

person sirplus    schedule 28.01.2015