Вопрос

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

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

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

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

GetNetworkPath

Это было полезно?

Решение

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

Хотя Visual Basic для приложений поддерживает объекты «Экран», «Принтер», «Приложение», «Отладка», «Ошибка» и «Буфер обмена», VBScript поддерживает только объект «Ошибка».Поэтому 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

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

Использование файла clip.exe от Microsoft наиболее близко к чистому системному решению 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

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

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

'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

Я нашел способ скопировать многострочную информацию в буфер обмена с помощью 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

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

Самый простой способ — использовать встроенный 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

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

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

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

Алкис

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

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

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

' 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top