【问题标题】:Issue using vbCRLF when copying to clipboard复制到剪贴板时使用 vbCRLF 的问题
【发布时间】:2014-09-25 19:38:43
【问题描述】:

我正在尝试将一些字符串提取到 Windows 剪贴板中,这工作正常;但试图在每个字符串之间放置回车和换行会导致问题,我知道它与这个线程有关:Escape angle brackets in a Windows command prompt

但我无法让我的代码使用提供的信息。

这是我的代码,没有任何 vbCRLF;

Dim objShell
Set objShell = CreateObject("WScript.shell")

objShell.Run "cmd /C echo " & Control_Address1.text & Control_Address2.text & Control_Address3.text & Control_Address4.text & "  | CLIP", 2

这导致字符串 Address1-4 上的内容一个接一个地输出,但我希望它们采用这种格式。

Address1
Address2
Address3
Address4

我试过了:

objShell.Run "cmd /C echo " & Control_Address1.text & vbCRLF & Control_Address2.text & vbCRLF & Control_Address3.text & vbCRLF & Control_Address4.text & "  | CLIP", 2

这导致“vbCTRL”被放入剪贴板,结果我了解了转义字符。然后我根据上面的线程尝试了下面的代码。

objShell.Run "cmd /C echo " & Control_Address1.text ^& vbCRLF ^& Control_Address2.text ^& vbCRLF ^& Control_Address3.text & vbCRLF & Control_Address4.text & "  | CLIP", 2

但这会导致语法错误,我认为我正朝着正确的方向前进,但似乎卡住了,您可以为新手提供的任何帮助将不胜感激!

【问题讨论】:

  • 感谢 MC ND 的格式更正,我不知道为什么它没有发布正确的布局。

标签: vbscript cmd


【解决方案1】:

问题是您不能在命令行中放置 CRLF。但是,如果您需要存储在剪贴板中的数据少于 8191 个字符,您可以将其存储在环境变量中,并通过延迟扩展从cmd 中检索它。

Option Explicit

Dim buffer
    buffer = Join( Array("Address1", "Address2", "Address3"), vbCRLF )

    With WScript.CreateObject("WScript.Shell") 
        .Environment("Process").Item("##") = buffer
        .Run "cmd /c ""(cmd /v:on /c echo(!##!)|clip"" ", 0, true
    End With

要放入剪贴板的数据存储在环境变量中(称为##),然后调用命令处理器并启用延迟扩展(/v:on),这是能够正确回显内容的要求带有 CRLF 的变量。

还有一种替代方法,使用 Internet Explorer

....
With CreateObject("InternetExplorer.Application")
    .Navigate "about:blank"
    .document.parentwindow.clipboardData.SetData "text", buffer
    .Quit
End With

但要使其正常工作,您可能需要调整 IE 中的权限。默认情况下,会显示一个对话框,要求用户授予脚本访问剪贴板的权限。

【讨论】:

  • 感谢您解释为什么这不起作用。我刚刚尝试了第一段代码(没有浏览器参与我正在做的事情)我收到以下错误:“控制脚本错误:预期语句(Microsoft VBScript 编译错误):选项显式”我没有使用之前的显式声明,经过短暂的谷歌搜索后,我尝试了打开或关闭的开关,但均无效,错误仍然相同。
  • @Peter, Option Explicit 是一个强制声明代码中使用的所有变量的指令(一个好习惯)。 OnOff 是可选的,On 是默认值。但是,Option Explicit 必须放在任何其他指令之前。因此,更改位置或尝试在没有它的情况下执行。
  • @Peter,第二个代码确实暗示您的项目正在使用 IE。它只是使用 IE 的自动化功能来访问它公开的clipboardData
  • 我很抱歉,我会记住以后会更具体。经过一番斗争,我得到了以下代码: Dim buffer buffer = Join( Array(Control_Address1.text, Control_Address2.text, Control_Address3.text, Control_Address4.text), vbCRLF ) With CreateObject("WScript.Shell") .Environment ("Process").Item("##") = buffer .Run "cmd /c ""(cmd /v:on /c echo(!##!)|clip"" ", 0, true 现在结束弄清楚如何使它成为有条件的。谢谢你所有的时间和帮助 MC ND,你太棒了!
  • 我很抱歉,我会记住以后会更具体。经过一番斗争,我得到了以下代码: Dim buffer buffer = Join( Array(Control_Address1.text, {}Control_Address2.text, Control_Address3.text, {}Control_Address4.text), vbCRLF ) {}With CreateObject ("WScript.Shell") {}.Environment("Process").Item("##") = buffer {}.Run "cmd /c ""(cmd /v:on /c echo(!##! )|clip"" ", 0, {}true End With 现在来研究如何使它成为有条件的。感谢您的所有时间和帮助 MC ND,您已经很棒了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
  • 2010-11-17
  • 2011-09-15
相关资源
最近更新 更多