Как я могу использовать буфер обмена в vbscript?

Примечание редактора.
Хотя этот вопрос конкретно касается копирования ссылки на файл в буфер обмена, его общий заголовок привел к ответам о том, как копировать/получать < em>текст.

Как пользователь Emacs в Windows, который часто прикрепляет файлы к письмам, я искал утилиту для копирования файла (не его содержимого) в буфер обмена, как это делает проводник Windows при щелчке правой кнопкой мыши/копировании) .

Я только что нашел это прямо здесь, на SO, который использует System.Windows.Forms.Clipboard` в небольшой программе, чтобы сделать именно это . Но это на C#, для которого у меня нет прямого доступа к компилятору. Вот и думаю, можно ли это сделать и как.

Я видел несколько ссылок, таких как это, что буфер обмена недоступен в VBScripting, но msdn показывает документацию для VB, поэтому я рискую задать вопрос.

Я никогда раньше не писал VBScript, но я попробовал несколько вещей, прежде чем спрашивать, начиная с запуска копии, вставленной «Hello world», а затем различных комбинаций CreateObject и т. д.

Обновление: мне нужно вызвать Clipboard.SetFileDropList, поэтому я не думаю, что смогу использовать ClipboardData, как это предлагается в ответах, у него нет этого метода.

Обновление для посетителей

Решение, которое я использовал, состояло в том, чтобы скомпилировать сам C#, я не знал, что у меня уже есть компилятор.

Еще одно обновление для посетителей https://stackoverflow.com/a/29963268/18573 Сейчас пользуюсь, вполне доволен.


person Miserable Variable    schedule 31.10.2013    source источник
comment
@Lankymart кажется, что вопрос касается добавления некоторого текста в буфер обмена, а не файлового объекта. См. stackoverflow.com/a/29963268/18573 решение, которое я использую.   -  person Miserable Variable    schedule 02.12.2016
comment
В этом случае вам нужно уточнить вопрос, особенно заголовок.   -  person user692942    schedule 02.12.2016


Ответы (4)


VBScript не поддерживает буфер обмена. Большинство хостов, на которых размещается vbscript, например Internet Explorer, предоставляют доступ через хост. Поэтому vbscript, работающий в IE или HTA, может использовать поддержку буфера обмена IE. Хосты сценариев не поддерживают буфер обмена. Вы можете использовать файл vbs для запуска IE через автоматизацию COM, перейти на локальную страницу (чтобы обойти предупреждения безопасности), а затем использовать буфер обмена IE.

Вот фрагмент кода (Outp. — текстовый поток)

    Set ie = CreateObject("InternetExplorer.Application") 
ie.Visible = 0
ie.Navigate2 "C:\Users\David Candy\Desktop\Filter.html"
Do 
    wscript.sleep 100
Loop until ie.document.readystate = "complete"  
txt=ie.document.parentwindow.clipboardData.GetData("TEXT")
ie.quit
If IsNull(txt) = true then 
    outp.writeline "No text on clipboard"
else
    outp.writeline txt
End If
person David Candy    schedule 31.10.2013

Вы можете сделать это с помощью html-объекта, чтобы получить содержимое буфера обмена:

' Get clipboard text
Set objHTML = CreateObject("htmlfile")
text = objHTML.ParentWindow.ClipboardData.GetData("text")

EDIT: я использую этот фрагмент, чтобы вернуть текст в буфер обмена, но для этого требуется стороннее программное обеспечение; автономный исполняемый файл clip.exe, который можно найти на сервере Windows 2003 или просто в интернете :

' Do something with the text
text = replace(text, "you ", "you and your dog ")

' Put it back to the clipboard
Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("clip")

Set oIn = oExec.stdIn

oIn.WriteLine text
oIn.Close

(да, это все немного хакерство)

person AutomatedChaos    schedule 31.10.2013
comment
Клип теперь по умолчанию в Windows (Win7). Ваше решение с WriteLine добавит разрыв строки. Это решение добавит пробел после: wshShell.Run cmd.exe /c set /p= & text & ‹nul|clip, 0, TRUE Я не знаю идеального решения с клипом :-( - person Thierry Dalon; 26.06.2017

Вам нужна эта функция (это небольшая модификация этой):

'TO CLEAR
ClipBoard("")

'TO SET
ClipBoard("Hello World!")

'TO GET
Result = ClipBoard(Null)

Function ClipBoard(input)
'@description: A quick way to set and get your clipboard.
'@author: Jeremy England (SimplyCoded)
  If IsNull(input) Then
    ClipBoard = CreateObject("HTMLFile").parentWindow.clipboardData.getData("Text")
    If IsNull(ClipBoard) Then ClipBoard = ""
  Else
    CreateObject("WScript.Shell").Run _
      "mshta.exe javascript:eval(""document.parentWindow.clipboardData.setData('text','" _
      & Replace(Replace(Replace(input, "'", "\\u0027"), """","\\u0022"),Chr(13),"\\r\\n") & "');window.close()"")", _
      0,True
  End If
End Function
person Ricardo Galain    schedule 31.01.2018
comment
Как я могу получить буфер обмена (путь к скопированному файлу/папке Windows) проводника Windows? Любая идея? Я пробовал искать по всему интернету и stackoverflow. Но нет ответов на конкретный вопрос. - person Thompson; 23.03.2019

В качестве эквивалента операции «вставки» я бы запустил утилиту командной строки, например ClipOut или paste, перенаправил вывод в файл и прочитал содержимое файла.

return = WshShell.Run("cmd /c clipout.exe > output.txt", 0, true)

Set fso  = CreateObject("Scripting.FileSystemObject")
Set file = fso.OpenTextFile("output.txt", 1)
text = file.ReadAll
file.Close

Вы можете получить ClipOut здесь: http://jasonfaulkner.com/ClipOut.aspx

Вы можете получить вставку здесь: https://www.c3scripts.com/tutorials/msdos/paste.html

В качестве эквивалента операции «копирования» я бы использовал утилиту командной строки clip, которая фактически поставляется с Windows, и аналогичный код, как указано выше.

Об утилите clip: https://blogs.msdn.microsoft.com/oldnewthing/20091110-00/?p=16093

person Fotios Basagiannis    schedule 09.09.2018