返回列表 发帖

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


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

评分人数

命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

复制文件(夹)到剪贴板

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


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

复制URL快捷方式的目标地址
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\InternetShortcut\shell\CopyLink]
@="复制链接(&F)"
[HKEY_CLASSES_ROOT\InternetShortcut\shell\CopyLink\command]
@="mshta vbscript:clipboardData.setData(\"text\",CreateObject(\"WScript.Shell\").CreateShortcut(\"%1\").TargetPath)(close)"COPY
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\CopyPath2Clip]
@="复制文件路径到剪贴板(&W)"
[HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\CopyPath2Clip\command]
@="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\""COPY
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\txtfile\shell\CopyText2Clip]
@="复制文本内容到剪贴板(&X)"
[HKEY_CLASSES_ROOT\txtfile\shell\CopyText2Clip\command]
@="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\""COPY
【代码技巧】批处理拷贝文件(夹)到剪贴板
http://www.bathome.net/thread-4223-1-1.html
@echo off
call :c2cb "%ProgramFiles%\microsoft frontpage"
exit /b
::Copy2ClipBoard
:c2cb
setlocal
set "f=%~1"
set "f=%f:\\=\%"
set "f=%f:\=\\%"
mshta "javascript:moveTo(screen.width,0);document.write('<img id=\'x\' src=\'%f%\'>');i=document.body.createControlRange();i.add(x);i.execCommand('copy');close()"
goto :eofCOPY
未完待续……

[ 本帖最后由 zqz0012005 于 2010-6-30 20:32 编辑 ]
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

右键菜单添加“保存剪贴板内容”

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

[ 本帖最后由 zqz0012005 于 2010-6-28 20:47 编辑 ]
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

相关帖子

批处理保存剪贴板信息
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
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 1楼 的帖子

将文本写到剪贴板是不是第三个代码最好?因为它true,就不怕文本长度影响?

TOP

楼主太好了,乐于助人

TOP

不了解Clip的应用范例为何? 直接 copy 过去不是可以吗 ?
為何需透過剪贴板 ?

TOP

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

这里设置的是“www.bathome.net”这种简单文本,如果文本太复杂,比如有特殊字符、换行等,则最好通过环境变量传递数据。
Set ws = CreateObject("WScript.Shell")
ws.Environment("process").item("@") = chr(34) & "a" & vbCrLf & "'b"
ws.run "mshta ""javascript:clipboardData.setData('text', new ActiveXObject('WScript.Shell').Environment('process').item('@'));close();""", 0, true
WScript.Echo CreateObject("htmlfile").parentWindow.clipboardData.getData("text")COPY
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

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

TOP

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

mshta.exe会造成屏幕闪烁一次,给人感觉不爽。有clip.exe的系统可用如下代码:
Set ws = CreateObject("WScript.Shell")
YourText = chr(34) & "a" & vbCrLf & "'b"
ws.Environment("process").item("@") = vbCrLf & YourText
ws.run "cmd.exe /d /c set @|more +1|clip.exe", 0, true
WScript.Echo CreateObject("htmlfile").parentWindow.clipboardData.getData("text")COPY
还是通过环境变量,会在文本末尾添加额外的空行(而且more会转换tab符为空格)。
当然如果文本简单,直接用echo或set/p就行了。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

学习

学习学习了!!!!!!!!

TOP

学习了,有没有html格式到剪贴板的例子呢

TOP

回复 7# pdanniel66


如果你要一切自动化呢?
有或者 你要 复制剪贴板内容中内容 却不想用户动手呢?

TOP

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

先调用moveTo到屏幕外就不会了!

TOP

rat你这家伙也知道回来。。。
***共同提高***

TOP

返回列表