Board logo

标题: [其他] 批处理、VBS剪贴板操作专题 [打印本页]

作者: zqz0012005    时间: 2010-6-23 23:04     标题: 批处理、VBS剪贴板操作专题

一、命令行工具:
winclip.exe
http://www.bathome.net/thread-1766-1-1.html
nircmd
http://www.nirsoft.net/utils/nircmd.html

二、系统组件的clipboardData对象:
1、InternetExplorer.Application
2、htmlfile、xmlfile、mhtmlfile(也是一种Automation Com组件,类似上面的;而不是网页文件,注意没有点哦)
3、mshta(也是利用DOM)

event对象的dataTransfer对象也有clearData、getData、setData这些方法

Maxthon、TheWorld、GreenBrowser、腾讯TT等IE核心的浏览器如果已经运行了,会劫持脚本对InternetExplorer.Application对象的调用,可能会因此出错

1、读取剪贴板中的文本
  1. Set oIE = CreateObject("InternetExplorer.Application")
  2. oIE.Navigate "about:blank"
  3. Do Until oIE.readyState=4 : WScript.Sleep 200 : Loop 'complete
  4. clipboardText = oIE.document.parentWindow.clipboardData.getData("text")
  5. WScript.Echo clipboardText
  6. oIE.Quit
复制代码
  1. Set oDOM = CreateObject("htmlfile") 'xmlfile、mhtmlfile都可以
  2. clipboardText = oDOM.parentWindow.clipboardData.getData("text")
  3. WScript.Echo clipboardText
复制代码
  1. 'Set oDOM = GetObject("about:blank", "htmlfile") '灾难性故障?
  2. Set oDOM = GetObject("\", "htmlfile") '随便用个什么文件名,不管是否存在,一定要是本地路径(C:\bathome或\boot.ini之类的)
  3. 'WScript.Echo oDOM.readyState
  4. Do Until oDOM.readyState="complete" : WScript.Sleep 200 : Loop 'complete
  5. 'WScript.echo oDOM.documentElement.outerHTML
  6. clipboardText = oDOM.parentWindow.clipboardData.getData("text")
  7. WScript.Echo clipboardText
复制代码
  1. mshta.exe "javascript:s=clipboardData.getData('text');alert(s);close();"
复制代码
DOM组件可能受到系统的安全限制,不能往剪贴板写数据(包括清空),只能读取
IE7及以上版本据说写操作时也会出现安全提示框


2、将文本写到剪贴板
  1. Set oIE = CreateObject("InternetExplorer.Application")
  2. oIE.Navigate "about:blank"
  3. Do Until oIE.readyState=4 : WScript.Sleep 200 : Loop 'complete
  4. strText = "www.bathome.net"
  5. oIE.document.parentWindow.clipboardData.setData "text", strText
  6. oIE.Quit
复制代码
  1. mshta.exe "javascript:clipboardData.setData('text', 'www.bathome.net');close();"
复制代码
  1. Set ws = CreateObject("WScript.Shell")
  2. ws.run "mshta ""javascript:clipboardData.setData('text', 'www.bathome.net');close();""", 0, true
  3. '最好设置等待标志为true,等待操作完成,保证后续语句能得到正确结果
  4. WScript.Echo CreateObject("htmlfile").parentWindow.clipboardData.getData("text")
复制代码
3、清空剪贴板
  1. Set oIE = CreateObject("InternetExplorer.Application")
  2. oIE.Navigate "about:blank"
  3. Do Until oIE.readyState=4 : WScript.Sleep 200 : Loop 'complete
  4. oIE.document.parentWindow.clipboardData.clearData
  5. oIE.Quit
复制代码
  1. mshta.exe "javascript:clipboardData.clearData();close();"
复制代码
  1. Set ws = CreateObject("WScript.Shell")
  2. ws.run "mshta javascript:clipboardData.clearData();close();", 0, true
复制代码

作者: zqz0012005    时间: 2010-6-23 23:04     标题: 复制文件(夹)到剪贴板

查看快捷方式的目标
  1. Windows Registry Editor Version 5.00
  2. [HKEY_CLASSES_ROOT\lnkfile\shell\Target]
  3. @="查看目标(&F)"
  4. [HKEY_CLASSES_ROOT\lnkfile\shell\Target\command]
  5. @="mshta vbscript:CreateObject(\"WScript.Shell\").Run(\"explorer /n,/select,\"&CreateObject(\"WScript.Shell\").CreateShortcut(\"%1\").TargetPath)(close)"
复制代码


复制lnk快捷方式的目标路径及参数
  1. Windows Registry Editor Version 5.00
  2. [HKEY_CLASSES_ROOT\lnkfile\shell\CopyLink]
  3. @="复制命令及参数(&G)"
  4. [HKEY_CLASSES_ROOT\lnkfile\shell\CopyLink\command]
  5. @="mshta vbscript:clipboardData.setData(\"text\",CreateObject(\"WScript.Shell\").CreateShortcut(\"%1\").TargetPath+chr(32)+CreateObject(\"WScript.Shell\").CreateShortcut(\"%1\").Arguments)(close)"
复制代码

复制URL快捷方式的目标地址
  1. Windows Registry Editor Version 5.00
  2. [HKEY_CLASSES_ROOT\InternetShortcut\shell\CopyLink]
  3. @="复制链接(&F)"
  4. [HKEY_CLASSES_ROOT\InternetShortcut\shell\CopyLink\command]
  5. @="mshta vbscript:clipboardData.setData(\"text\",CreateObject(\"WScript.Shell\").CreateShortcut(\"%1\").TargetPath)(close)"
复制代码
  1. Windows Registry Editor Version 5.00
  2. [HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\CopyPath2Clip]
  3. @="复制文件路径到剪贴板(&W)"
  4. [HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\CopyPath2Clip\command]
  5. @="mshta \"javascript:moveTo(-1000,-1000);document.write('<hta:application id=$ showInTaskbar=no />');fso=new ActiveXObject('Scripting.FileSystemObject');s=$.commandLine;q=String.fromCharCode(34);clipboardData.setData('text',s.match(new RegExp(q+'.*?'+q,'g')).pop().slice(1,-1));close();\" \"%1\""
复制代码
  1. Windows Registry Editor Version 5.00
  2. [HKEY_CLASSES_ROOT\txtfile\shell\CopyText2Clip]
  3. @="复制文本内容到剪贴板(&X)"
  4. [HKEY_CLASSES_ROOT\txtfile\shell\CopyText2Clip\command]
  5. @="mshta \"javascript:moveTo(-1000,-1000);document.write('<hta:application id=$ showInTaskbar=no />');fso=new ActiveXObject('Scripting.FileSystemObject');s=$.commandLine;q=String.fromCharCode(34);f=s.match(new RegExp(q+'.*?'+q,'g')).pop().slice(1,-1);clipboardData.setData('text',fso.OpenTextFile(f).ReadAll());close();\" \"%1\""
复制代码
【代码技巧】批处理拷贝文件(夹)到剪贴板
http://www.bathome.net/thread-4223-1-1.html
  1. @echo off
  2. call :c2cb "%ProgramFiles%\microsoft frontpage"
  3. exit /b
  4. ::Copy2ClipBoard
  5. :c2cb
  6. setlocal
  7. set "f=%~1"
  8. set "f=%f:\\=\%"
  9. set "f=%f:\=\\%"
  10. mshta "javascript:moveTo(screen.width,0);document.write('<img id=\'x\' src=\'%f%\'>');i=document.body.createControlRange();i.add(x);i.execCommand('copy');close()"
  11. goto :eof
复制代码
未完待续……

[ 本帖最后由 zqz0012005 于 2010-6-30 20:32 编辑 ]
作者: zqz0012005    时间: 2010-6-23 23:04     标题: 右键菜单添加“保存剪贴板内容”

右键菜单添加“保存剪贴板内容”
  1. Windows Registry Editor Version 5.00
  2. ; 保存剪贴板内容_所有文件右键_添加.reg
  3. [HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\SaveClipText]
  4. @="保存剪贴板内容(&B)"
  5. [HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\SaveClipText\command]
  6. @="mshta \"javascript:try{new ActiveXObject('Scripting.FileSystemObject').OpenTextFile(new Date().getTime()+'.txt',2,true).Write(clipboardData.getData('text'));}catch(e){alert('non-text');}close();\""
复制代码
  1. Windows Registry Editor Version 5.00
  2. ; 保存剪贴板内容_所有文件右键_删除.reg
  3. [-HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\SaveClipText]
复制代码
批处理如何在右键菜单中添加一键清空剪贴板的功能?
http://www.bathome.net/viewthread.php?tid=4541
  1. Windows Registry Editor Version 5.00
  2. ; 清空剪贴板_空白处右键_添加.reg
  3. [HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers\ClearClipboard]
  4. @="{00000000-0000-0000-0000-000000000012}"
  5. [HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-000000000012}\InProcServer32]
  6. @=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  7.   00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,73,00,68,00,\
  8.   64,00,6f,00,63,00,76,00,77,00,2e,00,64,00,6c,00,6c,00,00,00
  9. "ThreadingModel"="Apartment"
  10. [HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-000000000012}\Instance]
  11. "CLSID"="{3f454f0e-42ae-4d7c-8ea3-328250d6e272}"
  12. [HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-000000000012}\Instance\InitPropertyBag]
  13. "method"="ShellExecute"
  14. "Param2"="mshta"
  15. "Param1"="vbscript:clipboardData.clearData()(close)"
  16. "command"="清空剪贴板"
  17. "CLSID"="{13709620-C279-11CE-A49E-444553540000}"
复制代码
  1. Windows Registry Editor Version 5.00
  2. ; 清空剪贴板_空白处右键_删除.reg
  3. [-HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers\ClearClipboard]
  4. [-HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-000000000012}]
复制代码

[ 本帖最后由 zqz0012005 于 2010-6-28 20:47 编辑 ]
作者: Batcher    时间: 2010-6-25 13:42     标题: 相关帖子

批处理保存剪贴板信息
http://bbs.bathome.net/thread-7156-1-1.html

批处理将剪贴板中的内容保存为文件
http://bbs.bathome.net/thread-2875-1-1.html

批处理中如何将剪贴板里的文本赋给变量?
http://bbs.bathome.net/thread-7467-1-1.html

批处理如何清除剪贴板內容?
http://bbs.bathome.net/thread-3942-1-1.html

批处理怎样把需要的字符复制到windows剪贴板?
http://bbs.bathome.net/thread-2421-1-1.html

批处理结合VBS获取屏幕大小以及剪贴板内容
http://bbs.bathome.net/thread-7162-1-1.html
作者: shuaige100    时间: 2010-6-26 23:35     标题: 回复 1楼 的帖子

将文本写到剪贴板是不是第三个代码最好?因为它true,就不怕文本长度影响?
作者: shuaige100    时间: 2010-6-26 23:42

楼主太好了,乐于助人
作者: pdanniel66    时间: 2010-6-29 05:31

不了解Clip的应用范例为何? 直接 copy 过去不是可以吗 ?
為何需透過剪贴板 ?
作者: zqz0012005    时间: 2011-10-26 21:02

  1. Set ws = CreateObject("WScript.Shell")
  2. ws.run "mshta ""javascript:clipboardData.setData('text', 'www.bathome.net');close();""", 0, true
  3. '最好设置等待标志为true,等待操作完成,保证后续语句能得到正确结果
  4. WScript.Echo CreateObject("htmlfile").parentWindow.clipboardData.getData("text")
复制代码

这里设置的是“www.bathome.net”这种简单文本,如果文本太复杂,比如有特殊字符、换行等,则最好通过环境变量传递数据。
  1. Set ws = CreateObject("WScript.Shell")
  2. ws.Environment("process").item("@") = chr(34) & "a" & vbCrLf & "'b"
  3. ws.run "mshta ""javascript:clipboardData.setData('text', new ActiveXObject('WScript.Shell').Environment('process').item('@'));close();""", 0, true
  4. WScript.Echo CreateObject("htmlfile").parentWindow.clipboardData.getData("text")
复制代码

作者: powerbat    时间: 2011-10-26 21:35

补充
使用Word(好像必须是常规安装的word,绿色版、精简版没有注册此组件)
  1. '设置剪切板的内容
  2. Set Word = CreateObject("Word.Application")
  3. Word.Documents.Add
  4. Word.Selection.Text = "www.bathome.net"
  5. Word.Selection.Copy
  6. Word.Quit
复制代码
  1. '获取剪切板的内容
  2. Set Word = CreateObject("Word.Application")
  3. Word.Documents.Add
  4. Word.Selection.PasteAndFormat(22)
  5. Word.Selection.WholeStory
  6. str = Word.Selection.Text
  7. Word.Quit
  8. WScript.Echo str
复制代码
使用Microsoft Forms 2.0 Object Library(FM20.DLL),此组件好像也是office的一部分
  1. '设置剪切板的内容
  2. Set Form = CreateObject("Forms.Form.1")
  3. Set TextBox = Form.Controls.Add("Forms.TextBox.1").Object
  4. TextBox.MultiLine = True
  5. TextBox.Text = "www.bathome.net"
  6. TextBox.SelStart = 0
  7. TextBox.SelLength = TextBox.TextLength
  8. TextBox.Copy
复制代码
  1. Set Form = CreateObject("Forms.Form.1")
  2. Set TextBox = Form.Controls.Add("Forms.TextBox.1").Object
  3. TextBox.MultiLine = True
  4. If TextBox.CanPaste Then
  5.     TextBox.Paste
  6.     WScript.Echo TextBox.Text
  7. End If
复制代码

作者: zqz0012005    时间: 2011-10-26 22:22

这两个都要依赖office,不太感冒,特别是word太大了。
以前用过Forms.Form.1,发现写剪贴板有时不成功,经测试这个控件好像是异步的,如果宿主程序过早退出,这个对象还没有完成操作就被销毁了。解决方法是TextBox.Copy之后用WScript.Sleep方法延时一段时间。

mshta.exe会造成屏幕闪烁一次,给人感觉不爽。有clip.exe的系统可用如下代码:
  1. Set ws = CreateObject("WScript.Shell")
  2. YourText = chr(34) & "a" & vbCrLf & "'b"
  3. ws.Environment("process").item("@") = vbCrLf & YourText
  4. ws.run "cmd.exe /d /c set @|more +1|clip.exe", 0, true
  5. WScript.Echo CreateObject("htmlfile").parentWindow.clipboardData.getData("text")
复制代码
还是通过环境变量,会在文本末尾添加额外的空行(而且more会转换tab符为空格)。
当然如果文本简单,直接用echo或set/p就行了。
作者: guanzbin36o    时间: 2011-11-17 16:37     标题: 学习

学习学习了!!!!!!!!
作者: Bat_jiajia    时间: 2012-2-16 00:08

学习了,有没有html格式到剪贴板的例子呢
作者: garyng    时间: 2012-2-16 09:08

回复 7# pdanniel66


如果你要一切自动化呢?
有或者 你要 复制剪贴板内容中内容 却不想用户动手呢?
作者: rat    时间: 2012-2-29 16:52

mshta.exe会造成屏幕闪烁一次,给人感觉不爽。

先调用moveTo到屏幕外就不会了!
作者: batman    时间: 2012-2-29 17:04

rat你这家伙也知道回来。。。
作者: powerbat    时间: 2012-2-29 19:16

回复 14# rat


    还是会闪,就算用WScript.Shell的run隐藏运行也一样。
作者: 我来了    时间: 2013-4-9 17:28

麻烦 高老师 看下这个:
http://www.bathome.net/viewthrea ... mp;page=1#pid128902




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2