20

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

编辑: 回答有关此用途的问题。

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

我希望对话框中显示的 URL 也可以放在剪贴板上。

获取网络路径

4

15 回答 15

29

我发现在我看来并不完美但没有烦人的安全警告的另一个解决方案是使用来自 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
于 2008-09-26T00:17:45.237 回答
13

使用 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
于 2012-05-15T23:18:20.987 回答
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

于 2008-09-24T17:23:14.617 回答
7

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

于 2008-09-26T17:27:08.653 回答
6

没有安全警告,完全允许和获取访问权限:

'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
于 2011-12-19T17:32:22.320 回答
5

Microsoft 没有让 VBScript 直接访问剪贴板。如果你'clipboard'这个网站上搜索,你会看到:

尽管 Visual Basic for Applications 支持 Screen、Printer、App、Debug、Err 和 Clipboard 对象,但 VBScript 仅支持 Err 对象。因此,VBScript 不允许您访问诸如鼠标指针或剪贴板之类的有用对象。但是,您可以使用 Err 对象为您的应用程序提供运行时错误处理。

因此,间接使用记事本可能是您仅使用 VBScript 所能做的最好的事情。

于 2008-10-06T15:19:53.413 回答
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 从Link下载并放置在C:\.

于 2011-05-19T14:59:13.410 回答
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
于 2014-12-18T08:07:56.233 回答
3

最简单的方法是使用内置mshta.exe功能:

sText = "Text Content"
CreateObject("WScript.Shell").Run "mshta.exe ""javascript:clipboardData.setData('text','" & Replace(Replace(sText, "\", "\\"), "'", "\'") & "');close();""", 0, True

要将包含双引号 char 的字符串放入剪贴板",请使用以下代码:

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
于 2016-05-02T20:38:54.607 回答
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;
}
于 2013-04-25T13:51:59.170 回答
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
于 2013-10-10T13:35:51.933 回答
1

看看这个帖子它描述了一种从剪贴板读取的 hacky 方法,但我想它也可以适用于写入剪贴板,例如将 Ctrl+V 更改为 Ctrl+A 然后 Ctrl+C。

于 2012-12-03T16:34:28.270 回答
1

在您的 ClassClipBoard中, Clear 子和 Let Data 子都不起作用。我的意思是它们对 Windows 没有影响Clipboard。实际上,具有讽刺意味的是,唯一有效的子程序是您的示例中未包含的子程序,即获取数据!(我已经多次测试了这段代码。)

然而,这不是你的错。我曾尝试使用 ClipboardData.SetData 将数据复制到剪贴板,但这是不可能的。至少不是通过创建“htmlfile”对象。正如我在少数情况下看到的那样,它可能通过创建“InternetExplorer.Application”的实例来工作,但我还没有尝试过。我讨厌为如此简单的任务创建应用程序实例!

阿尔基斯

于 2014-09-10T12:48:35.930 回答
0

如果只是文本,您不能简单地创建一个文本文件并在需要时读取内容吗?

另一种选择,显然是一个杂凑,将是使用该SendKeys()方法。

于 2008-10-06T15:23:38.850 回答
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
于 2017-08-27T15:01:32.740 回答