2008-09-24 6 views
16

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

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

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

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

GetNetworkPath

+0

Из любопытства, какова цель для ПУ tting информацию в буфер обмена? Может ли временный файл .txt быть в порядке для хранения любых данных, с которыми вы работаете, которые удаляются, когда вы закончите? – unrealtrip 2008-10-14 18:09:03

ответ

4

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

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

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

10

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

+0

http://stackoverflow.com/a/21239166/185851 показывает, как использовать IE и временный файл для копирования текста в буфер обмена без создания всплывающего предупреждения. – Richard 2014-01-20 16:29:03

27

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

Это замечательно! Но как насчет размещения многострочной переменной вместо «hello world»? – 2012-05-07 07:23:35

+1

Просто проверено - клип доступен в Windows 7. – cup 2014-01-18 16:59:08

+1

это не удастся, потому что не существует способа передать * лоты * символов в списке аргументов оболочки CMD ... например, «http://x.com/?var1&var2» `&` нарушит этот скрипт. – gcb 2014-05-06 19:30:06

6

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

0

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

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

5

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

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: \.

3

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

'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 
10

Использование клипа 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 
1

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

2

я придумал еще один способ использовать 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; 
} 
2

Вот метод Srikanth в переводе на 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 
1

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

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

Alkis

4

Я нашел способ копирования информации многострочный в буфер обмена с помощью VBScript/CMD.

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

  • с VBS генерировать окончательный «отформатированную строку», что вам нужно скопировать в буфер обмена
  • генерировать (TXT) файл с «отформатированную строку» команды типа
  • использования с ЦМД чтобы вставить информацию для клипа с помощью трубы

Пример сценария:

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 
2

Самый простой способ заключается в использовании встроенных 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 
0

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

' 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