如何在VBScript中使用剪贴板?

6

编辑注释:

Editor's note:
虽然这个问题明确指的是如何将文件引用复制到剪贴板,但其通用标题导致了一些关于如何复制/获取文本的答案。

作为 Windows 上的 Emacs 用户,我经常在邮件中附加文件,并一直在寻找一种将文件(而不是文件内容)复制到剪贴板的工具,就像 Windows 资源管理器在右键单击/copy 时所做的那样。

我在这里发现了这个小程序,它使用 System.Windows.Forms.Clipboard` 在 C# 中实现了此功能。但由于我没有立即访问编译器的 C# 程序,所以我想知道是否可以完成这项操作以及如何完成。

我看到了几个参考资料,例如 这个,指出 VBScripting 中无法访问剪贴板,但 msdn 显示了 VB 的文档,因此我冒险提出此问题。

我以前从未编写过 VBScript,但在提问之前,我尝试了一些事情,例如运行复制粘贴的“Hello World”,然后尝试不同的CreateObject 组合等。

更新:我需要调用Clipboard.SetFileDropList,因此我认为我不能使用答案中建议的ClipboardData,它没有这个方法。

访问者的更新

我最终使用的解决方案是编译了C#本身,我不知道我已经有一个编译器。

访问者的另一个更新 https://dev59.com/RGQm5IYBdhLWcg3w-jBL#29963268是我现在正在使用的,非常愉快。


@Lankymart,这个问题似乎是关于将一些文本添加到剪贴板,而不是文件对象的问题。请参见https://dev59.com/RGQm5IYBdhLWcg3w-jBL#29963268以了解我使用的解决方案。 - Miserable Variable
2
在某些情况下,您需要修改问题,特别是标题。 - user692942
4个回答

18
您可以使用HTML对象来检索剪贴板的内容:

您可以使用HTML对象来检索剪贴板的内容:

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

编辑:我使用这段代码将文本放回剪贴板,但需要第三方软件;一个独立的可执行文件'clip.exe',可以在Windows 2003 Server上找到,或者在互联网上找到:

' 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

(是的,这都有点“黑客”的感觉)


1
现在(Win7),剪贴板默认在Windows中。您使用WriteLine的解决方案将附加一个换行符。此解决方案将在文本后附加一个空格:wshShell.Run "cmd.exe /c set /p=" & text & "<nul|clip", 0, TRUE。我不知道有关clip的完美解决方案 :-( - Thierry Dalon
使用setData,可以使用以下代码:https://gist.github.com/simply-coded/2a31cbd5a7000cb825907052edbe35fe调用CreateObject("WScript.Shell").Run("mshta.exe javascript:eval(""document.parentWindow.clipboardData.setData('text','your text tu clibboard');close()"")", 0, True )您可以将此代码放入扩展名为.vbs的文件中要获取数据,请使用以下代码: text = objHTML.ParentWindow.ClipboardData.GetData("text") - R.Alonso

4
VBScript不支持剪贴板。大多数托管VBScript的宿主,例如Internet Explorer,通过宿主提供访问权限。因此,在IE或HTA中运行的vbscript可以使用IE的剪贴板支持。脚本宿主不支持剪贴板。您可以使用vbs文件通过COM自动化启动IE,导航到本地页面(以绕过安全警告),然后使用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

AutomatedChaos的答案(https://dev59.com/rHjZa4cB1Zd3GeqPf5dQ#19703773)即使在Win7及以后版本的(非常)大数据量下也能更好地运行。 - superuser

4
你需要这个函数(这是对这个函数的小修改):
'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

我该如何获取Windows资源管理器中剪贴板(复制的文件/文件夹的Windows文件路径)?有什么想法吗?我尝试在整个互联网和stackoverflow上搜索,但没有找到特定的答案。 - Thompson

0
对于类似于“粘贴”操作的等效操作,我会运行命令行实用程序如 ClipOut 或 粘贴,将输出重定向到文件并读取文件内容。
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

你可以在这里获取paste: https://www.c3scripts.com/tutorials/msdos/paste.html

对于“复制”操作的等效操作,我会使用实际附带Windows和类似代码的clip命令行实用程序。

关于clip实用程序:https://blogs.msdn.microsoft.com/oldnewthing/20091110-00/?p=16093


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接