Используйте буфер обмена из VBScript

Я ищу способ разместить текст в буфер обмена с помощью VBScript. Рассматриваемый VBScript будет развернут как часть нашего сценария входа. Я хотел бы избегать использования всего, что недоступно в чистой системе Windows XP.

Изменить: В ответ на вопросы о том, для чего это.

Мы хотели призвать пользователей внутри нашей организации использовать файловый сервер для передачи документов вместо постоянной отправки вложений по электронной почте. Одним из главных препятствий для этого является то, что людям не всегда очевидно, какой правильный сетевой путь к файлу / папке. Мы разработали быстрый скрипт и прикрепили его к контекстному меню Windows, чтобы пользователь мог щелкнуть правой кнопкой мыши по любому файлу / папке и получить URL-адрес, который он может отправить кому-то в нашей организации.

Я хочу, чтобы URL, отображаемый в диалоговом окне, также помещался в буфер обмена.

GetNetworkPath

15 ответов

Решение

Microsoft не дает VBScript прямой доступ к буферу обмена. Если вы делаете поиск для 'clipboard'на этом сайте вы увидите:

Хотя Visual Basic для приложений поддерживает объекты Screen, Printer, App, Debug, Err и Clipboard, VBScript поддерживает только объект Err. Поэтому VBScript не позволяет вам получать доступ к таким полезным объектам, как указатель мыши или буфер обмена. Однако вы можете использовать объект Err для обеспечения обработки ошибок во время выполнения для ваших приложений.

Таким образом, косвенное использование блокнота - это, вероятно, лучшее, что вы сможете сделать только с помощью VBScript.

Другое решение, которое я нашел, которое, на мой взгляд, не идеально, но не имеет надоедливых предупреждений безопасности, - это использование clip.exe с сервера w2k3.

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "cmd.exe /c echo hello world | clip", 0, TRUE

http://www.petri.co.il/quickly_copy_error_and_display_messages.htm

Пример с многострочной строкой в ​​соответствии с вопросом ниже

Dim string
String = "text here" &chr(13)& "more text here"
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "cmd.exe /c echo " & String & " | clip", 0, TRUE

Использование Microsoft clip.exe наиболее близко к чистому системному решению Windows XP. Однако вам не нужно вызывать CMD.EXE для его размещения, чтобы использовать его. Вы можете вызвать его напрямую и записать в его поток ввода в коде вашего скрипта. После закрытия входного потока clip.exe запишет содержимое прямо в буфер обмена.

Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("clip")
Set oIn = oExec.stdIn
oIn.WriteLine "Something One"
oIn.WriteLine "Something Two"
oIn.WriteLine "Something Three"
oIn.Close

Если вам нужно дождаться завершения клипа, прежде чем ваш скрипт сможет продолжить обработку, добавьте

' loop until we're finished working.
Do While oExec.Status = 0
    WScript.Sleep 100
Loop

И не забудьте отпустить свои объекты

Set oIn = Nothing
Set oExec = Nothing

Наиболее близким решением, которое я нашел, является метод использования IE для получения и установки содержимого в буфер обмена. Проблема с этим решением - пользователь получает предупреждения безопасности. У меня возникает соблазн перейти в "зону безопасности" в зону безопасности локального компьютера, поэтому я не получаю предупреждений, но я не уверен, как это отразится на безопасности.

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Navigate("about:blank")
objIE.document.parentwindow.clipboardData.SetData "text", "Hello This Is A Test"
objIE.Quit

http://www.microsoft.com/technet/scriptcenter/resources/qanda/dec04/hey1215.mspx

Нет предупреждений безопасности, полный доступ и получить доступ:

'create a clipboard thing
 Dim ClipBoard
 Set Clipboard = New cClipBoard

 ClipBoard.Clear  
 ClipBoard.Data = "Test"

Class cClipBoard
        Private objHTML

                Private Sub Class_Initialize
                        Set objHTML = CreateObject("htmlfile")
                End Sub

                Public Sub Clear()
                        objHTML.ParentWindow.ClipboardData.ClearData()
                End Sub

                Public Property Let Data(Value)
                        objHTML.ParentWindow.ClipboardData.SetData "Text" , Value
                End Property

                Public Property Get Data()
                        Data = objHTML.ParentWindow.ClipboardData.GetData("Text")
                End Property

                Private Sub Class_Terminate
                        Set objHTML = Nothing
                End Sub

End Class

Пример использования.

' Create scripting object
Dim WShell, lRunUninstall
Set WShell = CreateObject("WScript.Shell")
WShell.sendkeys "^c"
WScript.Sleep 250
bWindowFound = WShell.AppActivate("Microsoft Excel")
 WShell.sendkeys ClipBoard.Data

Чтобы избежать предупреждений безопасности, связанных с Internet Explorer и доступом к буферу обмена, я бы порекомендовал вам использовать объект приложения Word и его методы для помещения ваших данных в буфер обмена. Конечно, вы можете использовать это только на компьютере с установленным MS Word, но в настоящее время это большинство из них. (* Несмотря на то, что вы просили вещи в "чистой" системе:) *)

' Set what you want to put in the clipboard '
strMessage = "Imagine that, it works!"

' Declare an object for the word application '
Set objWord = CreateObject("Word.Application")

' Using the object '
With objWord
   .Visible = False         ' Don't show word '
   .Documents.Add           ' Create a document '
   .Selection.TypeText strMessage   ' Put text into it '
   .Selection.WholeStory        ' Select everything in the doc '
   .Selection.Copy          ' Copy contents to clipboard '
   .Quit False          ' Close Word, don't save ' 
End With

Вы можете найти подробности об объекте приложения MS Word и его методах здесь: http://msdn.microsoft.com/en-us/library/aa221371(office.11).aspx

Вот еще одна версия использования команды "clip", которая позволяет не добавлять возврат каретки, перевод строки в конец строки:

strA= "some character string"

Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run "cmd /C echo . | set /p x=" & strA & "| c:\clip.exe", 2

s = "String: """ & strA & """ is on the clipboard."
Wscript.Echo s

Я проверял это только в XP. clip.exe был загружен с http://www.petri.co.il/downloads/clip.zip и помещен в C:\ .

Я нашел способ скопировать многострочную информацию в буфер обмена с помощью vbscript/cmd.

Последовательность:

  • с помощью VBS создайте окончательную "отформатированную строку", которую нужно скопировать в буфер обмена
  • создать (TXT) файл с "форматированной строкой"
  • используйте команду type из cmd, чтобы вставить информацию для обрезки по трубе

Пример скрипта:

Function CopyToClipboard( sInputString )

    Dim oShell: Set oShell = CreateObject("WScript.Shell")
    Dim sTempFolder: sTempFolder = oShell.ExpandEnvironmentStrings("%TEMP%")
    Dim sFullFilePath: sFullFilePath = sTempFolder & "\" & "temp_file.txt"

    Const iForWriting = 2, bCreateFile = True
    Dim oFSO: Set oFSO = CreateObject("Scripting.FileSystemObject")
    With oFSO.OpenTextFile(sFullFilePath, iForWriting, bCreateFile)
        .Write sInputString
        .Close
    End With

    Const iHideWindow = 0, bWaitOnReturnTrue = True
    Dim sCommand: sCommand = "CMD /C TYPE " & sFullFilePath & "|CLIP"
    oShell.Run sCommand, iHideWindow, bWaitOnReturnTrue

    Set oShell = Nothing
    Set oFSO = Nothing

End Function

Sub Main

    Call CopyToClipboard( "Text1" & vbNewLine & "Text2" )

End Sub

Call Main

Самый простой способ - использовать встроенный mshta.exe функциональность:

sText = "Text Content"
CreateObject("WScript.Shell").Run "mshta.exe ""javascript:clipboardData.setData('text','" & Replace(Replace(sText, "\", "\\"), "'", "\'") & "');close();""", 0, True

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

sText = "Text Content and double quote "" char"
CreateObject("WScript.Shell").Run "mshta.exe ""javascript:clipboardData.setData('text','" & Replace(Replace(Replace(sText, "\", "\\"), """", """"""), "'", "\'") & "'.replace('""""',String.fromCharCode(34)));close();""", 0, True

Я изобрел другой способ использования IE и все же избегаю предупреждений безопасности...

Кстати... эта функция в JavaScript... но вы можете легко преобразовать ее в VBScript..

function CopyText(sTxt) {
    var oIe = WScript.CreateObject('InternetExplorer.Application');
    oIe.silent = true;
    oIe.Navigate('about:blank');
    while(oIe.ReadyState!=4) WScript.Sleep(20);
    while(oIe.document.readyState!='complete') WSript.Sleep(20);
    oIe.document.body.innerHTML = "<textarea id=txtArea wrap=off></textarea>";
    var oTb = oIe.document.getElementById('txtArea');
    oTb.value = sTxt;
    oTb.select();
    oTb = null;
    oIe.ExecWB(12,0);
    oIe.Quit();
    oIe = null;
}

Вот метод Сриканта, переведенный в VBS

function SetClipBoard(sTxt)
    Set oIe = WScript.CreateObject("InternetExplorer.Application")
    oIe.silent = true
    oIe.Navigate("about:blank")
    do while oIe.ReadyState <> 4
        WScript.Sleep 20
    loop

    do while oIe.document.readyState <> "complete"
        WScript.Sleep 20
    loop

    oIe.document.body.innerHTML = "<textarea id=txtArea wrap=off></textarea>"
    set oTb = oIe.document.getElementById("txtArea")
    oTb.value = sTxt
    oTb.select
    set oTb = nothing
    oIe.ExecWB 12,0
    oIe.Quit
    Set oIe = nothing
End function


function GetClipBoard()
    set oIe = WScript.CreateObject("InternetExplorer.Application")
    oIe.silent = true
    oIe.Navigate("about:blank")
    do while oIe.ReadyState <> 4
        WScript.Sleep 20
    loop

    do while oIe.document.readyState <> "complete"
        WScript.Sleep 20
    loop 

    oIe.document.body.innerHTML = "<textarea id=txtArea wrap=off></textarea>"
    set oTb = oIe.document.getElementById("txtArea")
    oTb.focus   
    oIe.ExecWB 13,0
    GetClipBoard = oTb.value
    oTb.select
    set oTb = nothing
    oIe.Quit
    Set oIe = nothing
End function

Посмотрите на этот пост. В нем описан хакерский подход к чтению из буфера обмена, но я думаю, что он может быть адаптирован и для записи в буфер обмена, например, изменение Ctrl+V на Ctrl+A, а затем Ctrl+C.

В вашем классе ClipBoard, ни подпрограмма Clear, ни подпрограмма Let Data не работают. Я имею в виду, они не влияют на Windows Clipboard, На самом деле, и по иронии судьбы, единственное, что работает, это тот, который вы не включили в свой пример, то есть Get Data! (Я тестировал этот код довольно много раз.)

Однако это не твоя вина. Я пытался скопировать данные в буфер обмена с ClipboardData.SetData, и это невозможно. По крайней мере, не путем создания объекта "htmlfile". Может быть, это работает путем создания экземпляра "InternetExplorer.Application", как я видел в нескольких случаях, но я не пробовал. Я ненавижу создавать экземпляры приложений для таких простых задач!

Alkis

Нет предупреждений безопасности и возврата каретки в конце строки

' value to put in Clipboard
mavaleur = "YEAH"

' current Dir
path = WScript.ScriptFullName
GetPath = Left(path, InStrRev(path, "\"))

' Put the value in a file
Set objFSO=CreateObject("Scripting.FileSystemObject")
outFile=GetPath & "fichier.valeur"
Set objFile = objFSO.CreateTextFile(outFile,True)
objFile.Write mavaleur
objFile.Close

' Put the file in the Clipboard
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "cmd.exe /c clip < " & outFile, 0, TRUE

' Erase the file
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFile outFile

Если это просто текст, разве вы не можете просто создать текстовый файл и читать содержимое, когда вам это нужно?

Еще одна альтернатива, и, несомненно, это клудж, - это использовать SendKeys() метод.

Другие вопросы по тегам