VBS 调用 HTA 实现进度条加载

18 篇文章 1 订阅

因为工作需要前几天做了个导表脚本 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!",,"策划导表,闲人回避!"

 

 


一不做二不休,再来个广告吧

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑虾

多情黯叹痴情癫。情癫苦笑多情难

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值