因为工作需要前几天做了个导表脚本 XLS2TXT
但是当表很多时有个纠结的问题,不显示EXCEL会让人不知道进展,还以为卡死了。
显示excel 不停的刷表格,很不美观。
我是无法接受这种情况的,所以硬着头皮做了个进度条。这里只是进度条的部分,还没有放进导表工具里。
些脚本的编写中学到的知识点如下:
1、VBS中JS中环境变量的应用
2、VBS调用MSHTA 只所以没有写临时文件,是因为只要有写操作很容易被当成病毒。
3、MSHTA 参数有字符数量的限制,于是在HTA中只简单的写了个HTML的主体加上动态创建脚本的功能(脚本来自环境变量)。这样就可以完成进度条UI的需要了。环境变量到底能传多长的字符我没有测试过,起码现在是够用了。(实在不行可写个循环往里慢慢加吧,不知可行不)
4、VBS调用MSHTA再调用javascript 这个字符串拼接是个大大的头痛。(要是有个自动转换的工具就好了。我这里是一点一点试的)
5、Exec 方法可以返回进程ID (这样进度条被关掉,VBS就可以停工了)
Set ws = CreateObject("WScript.Shell")
Set ws = CreateObject("WScript.Shell")
Set oExec = ws.Exec( "mshta javascript:""<title>VBS调用MSHTA演示!</title>网上好多VBS的这里用JS的吧!""" )
MsgBox oExec.ProcessID
Set ws = CreateObject("WScript.Shell")
'创建用户变量
set oshell=createobject("wscript.shell")
set env=oshell.environment("user")
'在HTA中动态创建脚本加载 jerryHtml_env 的内容
myHtml = "mshta javascript:""<HTA:Application scroll='no'><html><body></body><script>var wsh=new ActiveXObject('WScript.Shell');var myscript = document.createElement('SCRIPT');myscript.text=wsh.Environment('user').Item('jerryHtml_env');document.body.appendChild(myscript);</script><SCRIPT Language='VBScript'>window.moveTo screen.availWidth/4, screen.availHeight/3</SCRIPT></html>"""
env("jerryCount_env") = 1
Set oExec = ws.Exec(myHtml)
'jerryHtml_env: HTA的主体,通过js动态创建进度条写入 <body>
env("jerryHtml_env") ="var mydiv = document.createElement('div');mydiv.innerHTML=""<body>" _
& "<style type='text/css'>body{text-align:center}.process-bar{width:80%;top:20%;display:inline-block;zoom:2}.pb-wrapper{border:1px solid gray;position:relative;background:#cfd0d2;border-style:solid none}.pb-container{text-align:left;border:1px solid gray;height:12px;position:relative;left:-1px;margin-right:-2px;font:1px/0 arial;border-style:none solid;padding:1px}.pb-highlight{position:absolute;left:0;top:0;width:100%;opacity:.6;filter:alpha(opacity=60);height:6px;background:#FFF;font-size:1px;line-height:0;z-index:1}.pb-text{width:100%;position:absolute;left:46%;top:0;color:#000;font:10px/12px arial}.pb-value{height:100%;width:10%;background:#19d73d}.skin-green .pb-wrapper{border-color:#628c2d #666 #666}.skin-green .pb-container{border-color:#666 #666 #666 #628c2d}</style>" _
& "o(∩_∩)o 导表中。。。<div class='process-bar skin-green pb-wrapper'><div class='pb-highlight'></div><div class='pb-container'><div class='pb-text' id='ptx'></div><div class='pb-value' id='pID'></div></div></div>" _
& "</body>"";" _
& "window.resizeTo(screen.availWidth/2, screen.availHeight/4);document.title = '策划导表,闲人回避!';document.body.appendChild(mydiv);var wsh=new ActiveXObject('WScript.Shell');window.setInterval(function(){var str=wsh.Environment('user').Item('jerryCount_env');if(str=='100%完成')window.close();document.getElementById('pID').style.width=str;document.getElementById('ptx').innerHTML=str;},50);"
'jerryCount_env:VBS里的进度参数。HTA中 window.setInterval()每半秒读一次刷新进度条。
'循环,测试用
For i = 0 To 100 Step 10
WScript.Sleep 50
env("jerryCount_env") = i&"%"
Next
'自已来控制HTA的关闭: if(str=='100%完成')window.close()。要注意的是,先判断是否满足,再设置进度的宽度。因为 width='100%完成'可不行
env("jerryCount_env") = "100%完成"
'显示 HTA的进程ID。到100%可以杀进程。也可以到HTA中去判断自行关闭。
MsgBox "HTA的进程ID:" & oExec.ProcessID & chr(13)&"VBS中可以进行判断,如果进度条窗口被关闭,则结束VBS!",,"策划导表,闲人回避!"
一不做二不休,再来个广告吧