Подтвердить что ты не робот

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

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

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

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

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

GetNetworkPath

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

Использование Microsoft clip.exe ближе всего к чистому системному решению Windows XP. Однако вам не нужно вызывать CMD.EXE для его размещения, чтобы использовать его. Вы можете вызвать его напрямую и записать в свой поток ввода в свой script код. После закрытия входного потока 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

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

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

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

Set oIn = Nothing
Set oExec = Nothing

Ответ 5

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

Ответ 6

Здесь другая версия использования команды "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: \.

Ответ 7

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

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

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

Пример script:

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

Ответ 8

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

'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

Ответ 9

Я разработал другой способ использования 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;
}

Ответ 10

Здесь представлен метод Шриканта в 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

Ответ 11

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

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

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

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

Ответ 12

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

Ответ 13

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

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

Алкис

Ответ 14

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

Другой альтернативой и, очевидно, kludge, будет использование метода SendKeys().

Ответ 15

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

' 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