使用VBScript从剪贴板中复制内容

22

我正在寻找一种方法,使用VBScript将一些文本放置到剪贴板上。相关的VBScript将作为我们的登录脚本的一部分进行部署。我希望避免使用任何在干净的Windows XP系统上不可用的东西。

编辑: 关于这是做什么的问题的回答。

我们希望鼓励组织内的用户使用文件服务器传输文档,而不是不断通过电子邮件发送附件。其中最大的障碍之一是人们并不总是清楚文件/文件夹的正确网络路径是什么。我们开发了一个快速脚本,并将其附加到Windows上下文菜单,以便用户可以右键单击任何文件/文件夹,并获得一个URL,他们可以向组织内其他人发送电子邮件。

我希望在对话框中显示的URL也能放置到剪贴板上。

GetNetworkPath


出于好奇,将信息放入剪贴板的目的是什么?使用临时 .txt 文件存储您正在处理的任何数据并在完成后删除是否可以? - unrealtrip
15个回答

32

我找到的另一个解决方案,我认为并不完美,但不会出现烦人的安全警告,那就是使用来自w2k3服务器的clip.exe。

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "cmd.exe /c echo hello world | clip", 0, TRUE

以下是一个带有多行字符串的示例,如下面的问题所述: Link1

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”呢? - Marco Panichi
1
刚刚检查过了 - 在Windows 7上可以使用剪贴板。 - cup
2
这将失败,因为在CMD shell参数列表中没有传递大量字符的方法...例如"http://x.com/?var1&var2"中的`&`将会破坏该脚本。 - gcb
@gcb 是的,你说得对。那不是我的原始答案的一部分,是社区中的某个人编辑进去的。我同意有许多字符串值可能会导致它出现错误。你有什么想法可以修复这个例子,使其能够使用任意值? - Zoredache
适用于Windows 10 :) 谢谢 - Thorsten Niehues
显示剩余2条评论

15

使用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

1
非常好的答案,但将对象设置为Nothing几乎总是毫无意义的。http://blogs.msdn.com/b/ericlippert/archive/2004/04/28/when-are-you-required-to-set-objects-to-nothing.aspx - Tmdean
1
@Tmdean 不是真的,特别是在数据库任务方面,您不希望资源在不再需要时仍然保持打开状态。Eric所说的是在具有自己作用域的函数内部使用,当它们超出作用域时,对象将被销毁,因此无需手动取消引用它们。 - user692942

11

目前我找到的最接近的解决方法是使用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

: http://www.microsoft.com/technet/scriptcenter/resources/qanda/dec04/hey1215.mspx

http://stackoverflow.com/a/21239166/185851 展示了如何使用IE和临时文件,以便在不生成弹出警告的情况下将文本复制到剪贴板上。 - Richard

9

无安全警告,完全的访问权限:

'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

这对我有用。更短的版本:https://microsoft.public.scripting.vbscript.narkive.com/nNLRUHlK/turning-clipboard-contents-into-a-variable-in-a-vbs-file - Justin Putney

8
为了避免与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


5
这是使用“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下载链接在这里,将其放置于C:\目录下。


5
微软没有提供VBScript直接访问剪贴板的方法。如果在this网站上搜索'clipboard',你会看到:
尽管Visual Basic for Applications支持Screen、Printer、App、Debug、Err和Clipboard对象,但VBScript仅支持Err对象。因此,VBScript不允许您访问鼠标指针或剪贴板等有用的对象。但是,您可以使用Err对象为应用程序提供运行时错误处理。
因此,使用记事本间接访问可能是您只能用VBScript做的最好的办法。

4

我找到了一种通过vbscript/cmd复制多行信息到剪贴板的方法。

步骤:

  • 使用VBS生成你需要复制到剪贴板的最终“格式化字符串”
  • 生成一个包含“格式化字符串”的(txt)文件
  • 使用cmd中的type命令通过管道粘贴信息到剪贴板

示例脚本:

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

3
最简单的方法是使用内置的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

2

请参考这篇文章,它介绍了一种奇技淫巧来从剪贴板中读取内容,但我认为也可以适应于将内容写入剪贴板中,例如更改Ctrl+V为Ctrl+A然后Ctrl+C。


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