Используйте буфер обмена из VBScript - PullRequest
17 голосов
/ 24 сентября 2008

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

Edit: В ответ на вопросы о том, для чего это нужно.

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

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

GetNetworkPath

Ответы [ 15 ]

27 голосов
/ 26 сентября 2008

Другое решение, которое я нашел, которое, на мой взгляд, не идеально, но не имеет надоедливых предупреждений безопасности, - это использование 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
10 голосов
/ 16 мая 2012

Использование 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
10 голосов
/ 24 сентября 2008

Наиболее близким решением, которое я нашел до сих пор, является метод использования 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

6 голосов
/ 26 сентября 2008

Чтобы избежать предупреждений безопасности, связанных с доступом к 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

5 голосов
/ 19 мая 2011

Вот еще одна версия использования команды «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: \.

4 голосов
/ 18 декабря 2014

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

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

  • с помощью VBS генерирует окончательную «отформатированную строку», которую нужно скопировать в буфер обмена
  • создать (txt) файл с «форматированной строкой»
  • использовать команду типа из 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
4 голосов
/ 19 декабря 2011

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

'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
4 голосов
/ 06 октября 2008

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

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

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

2 голосов
/ 02 мая 2016

Самый простой способ - использовать встроенную 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
2 голосов
/ 10 октября 2013

Вот метод Сриканта, переведенный в 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
...