Используйте буфер обмена из VBScript
Я ищу способ разместить текст в буфер обмена с помощью VBScript. Рассматриваемый VBScript будет развернут как часть нашего сценария входа. Я хотел бы избегать использования всего, что недоступно в чистой системе Windows XP.
Изменить: В ответ на вопросы о том, для чего это.
Мы хотели призвать пользователей внутри нашей организации использовать файловый сервер для передачи документов вместо постоянной отправки вложений по электронной почте. Одним из главных препятствий для этого является то, что людям не всегда очевидно, какой правильный сетевой путь к файлу / папке. Мы разработали быстрый скрипт и прикрепили его к контекстному меню Windows, чтобы пользователь мог щелкнуть правой кнопкой мыши по любому файлу / папке и получить URL-адрес, который он может отправить кому-то в нашей организации.
Я хочу, чтобы URL, отображаемый в диалоговом окне, также помещался в буфер обмена.
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()
метод.