当前位置: 首页 > 图文教程 > 脚本技术 > VBScript > 好玩的vbs特色代码

VBScript
用VBScript批量安装网络打印机和设置默认打印机
Vbs 脚本编程简明教程之一
vbs SendKey 用法 Sendkey 键盘对应的码表
用vbs 取得收藏夹里的所有链接名称和URL的脚本
link-view.vbs 页面链接查看
VBS读网页的代码
用VBScript写合并文本文件的脚本
vbscript ms owc 封裝代码
VbScript 封裝MS OWC(二)
vbs 注册表操作代码(添加删除)
用于修复XP中最小化程序 在任务栏显示图标的vbs脚本
完整的注册表操作实例 VBS脚本
vbs 注册表实现木马自启动
reg2vbs.vbs 将Reg文件转换为VBS文件保存 IT学习网修正版本
e是自然对数的底 e.vbs
vbs imail 密码解密
VBS Runas 自动输入密码, 明文
vbscript 三个数比较大小的实现代码
脚本 MsAgent组件 微软精灵 揪出系统自带的宠物
VBS InternetExplorer.Application的属性和方法介绍

VBScript 中的 好玩的vbs特色代码


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-12   浏览: 813 ::
收藏到网摘: n/a

用什么来表示组合?比如从5个数里面选n个数,你怎么用一个数字来表述你的选择结果?注意是一个数字。
硬盘的权限就是一个例子,参考脚本手册FileSystem文件Attributes 属性部分:
Normal 0 普通文件。不设置属性。
ReadOnly 1 只读文件。属性为读/写。
Hidden 2 隐藏文件。属性为读/写。
System 4 系统文件。属性为读/写。
Volume 8 磁盘驱动器卷标。属性为只读。
Directory 16 文件夹或目录。属性为只读。
Archive 32 文件在上次备份后已经修改。属性为读/写。
Alias 64 链接或者快捷方式。属性为只读。
Compressed 128 压缩文件。属性为只读。
如果选择了其中任意几个数字相加,比如得到65,那么你选择的肯定是1和64的组合,vbs里面的And 运算符还对两个数值表达式中位置相同的位执行逐位比较,如果 1 and 65 得到的是1那么说明65可以表示你的选择里面含有1,如果是0则没有。
还有一个的问题是:链表型的数据结构如何描述,一个表型的数据,可以根据行索引,可以方便增加删除行,并且增加数据前判断一行是否重复。而且代码不是特别多,速度不是特别慢,运行过程可以把数据显示出来供程序员调试?
在vbs里面可以利用dictionary来模拟,Item项是一个一维数组。
这两种个数据结构的原理我用到了一个游戏题目里:
<style>
body,td{font-size:12px;}
table{border:1px solid lightblue;border-collapse:collapse;width:100%;}
</style>
四人欲过一座河,且只有一个氧气瓶(每次最多能容两人同时游过). <br/>
甲单独过河需1分钟,乙需2分钟,丙需5分钟,丁需7分钟. 则四人全部通过的最短时间是多少. <br/>
<button onclick="vbs:try">过河</button>
<p id="ppp"></p>
<SCRIPT LANGUAGE="vbScript">
'本题属于决策树类型问题
'难点在于数据的描述上
'决策树的数据关键是:初始状态,操作步骤,结束状态
'每次递归的输入值--初始状态,是上次运算的结果--结束状态
'因此经过反复推敲,决定用:岸边状态+操作步骤编码+时间结果+开关状态来描述

'技巧:关于搭档方式的描述,采用2的n次方相加,实现用一个数来表示2个数搭配的目的
'比如01搭档,那么表示方法就是2^0 + 2^1=3职能是01搭配才会产生,绝对不会是其他数字
'见partner函数
personTime =Array(1,2,5,7)'每个人花费时间
startBank="0 1 2 3"'用空格分开表示河左岸的人的状态
set solution = CreateObject("Scripting.Dictionary")'
'用一个结构体来描述数据,每行的格式如下:
'solution.Add P,Array(onceTime,lBank,rBank,0)
sub try
'点按钮开始递归调用
if solution.Count=0 then
set solution=gogo("",0,startBank)
else
if isFinish(solution) then
succeed
exit sub
else
set solution=aa(solution)
end if
end if
show solution
end sub

function gogo(K,T,L)
'输入:K步骤序列 string
'输入:T上步骤执行时间 int
'输入:L可选择的人员名单 string
'输出:返回后的结构体 Dictionary
set scheme = CreateObject("Scripting.Dictionary")
dim tempArr:tempArr=split(L)
n=n+1
for each i in tempArr
for each j in tempArr
if i<>j then
onceTime=maxTime(i,j) + T
P=trim(K & " " & partner(i,j))
rBank=trim(otherBank(L) & " " & i & " " & j)
lBank=otherBank(rBank)
if not scheme.Exists(P) then
scheme.Add P,Array(onceTime,lBank,rBank,0)
end if
end if
next
next
set gogo=scheme
end function
function aa(D)
'输入:结构体 Dictionary
'输出:返回后的结构体 Dictionary
set scheme = CreateObject("Scripting.Dictionary")
for each K in D.Keys
T=D.Item(K)(0)
bool=D.Item(K)(3)
' alert K
if cbool(bool) then
L=D.Item(K)(1)
link gogo(K,T,L),scheme
else
L=D.Item(K)(2)
link back(K,T,L),scheme
end if
next
set aa=scheme
end function
'set D = CreateObject("Scripting.Dictionary")
'D.Exists(
sub link(D1,D2)
'输入:D1结构体 Dictionary
'输入返回:D2结构体 Dictionary
for each K in D1.Keys
if not D2.Exists(K) then D2.add K,D1.Item(K)
next
end sub

function back(K,T,L)
'输入:K步骤序列 string
'输入:T上步骤执行时间 int
'输入:L可选择的人员名单 string
'输出:返回后的结构体 Dictionary
set scheme = CreateObject("Scripting.Dictionary")
dim tempArr:tempArr=split(L)
for each i in tempArr
onceTime=personTime(cint(i)) + T
P=trim(K & " " & i)
lBank= otherBank(L) & " " & i
rBank= otherBank(lBank)
scheme.Add P,Array(onceTime,lBank,rBank,1)
next
set back=scheme
end function
function remove(L,i)
'输入:L人员名单 string
'输入:i被移出人的编号 int
'输出:移出后的人员名单 string
L=L & " "
L=replace(L,i & " ","")
remove=trim(L)
end function
function otherBank(L)
'输入:这岸的名单 string
'输出:得到另外一个岸边的名单 string
tempArr=split(L)
LL=startBank
for each i in tempArr
LL=remove(LL,i)
next
otherBank=LL
end function

function maxTime(x,y)
'输入:x,y人的编号int
'输出:得到两个人一次过河的最大时间int
a=personTime(cint(x))
b=personTime(cint(y))
if a>b then maxTime=a else maxTime=b
end function
function PtoMan(P)
'输入:P单个方案 string
'输出:由两个人名组合的方案 string
dim tempStr
dim bound:bound=ubound(personTime)
for i=0 to bound
for j=0 to bound
if i<>j and (partner(i,j)=P) then
tempStr=i & " " & j
exit for
exit for
end if
next
next
PtoMan=tempStr
end function
function PforRead(P)
'输入:P有空格分隔的方案序列 string
'输出:可读懂的方案序列 string
tempArr=split(P)
dim tempStr
for i=0 to ubound(tempArr)
if (i mod 2) =0 then
tempStr =tempStr & PtoMan(tempArr(i)) & "过去 "
else
tempStr =tempStr & tempArr(i) & "回来 "
end if
next
PforRead=tempStr
end function
function partner(x,y)
'输入两个数, 代表组合唯一值,存放到字符串里int
'输出:
a=cint(x)
b=cint(y)
partner=cstr(2^a +2^b)
end function
sub show(D)
'输入:D字典Dictionary
'显示字典中的内容
dim i:i=1
re= "<table border=1>"
re=re & "<tr><td>行号</td><td>过河方案</td><td>花费时间</td><td>左岸状态</td><td>右岸状态</td><td>过河开关</td></tr>"
for each key in D.Keys
re=re & "<tr><td>" & i & "</td><td title='" & key & "'>" & PforRead(key) & "</td>"
for each a in D.Item(key)
re=re & "<td>" & a & "</td>"
next
re=re & "</tr>"
i=i+1
next
re=re & "</table>"
ppp.innerHTML=re
end sub
function D2Arr(D)
'输入:D字典Dictionary
'输出:时间结果数组,第一个元素设置为极小,不参与排序,array
dim kArr:kArr=D.keys
dim tempArr():redim tempArr(ubound(kArr)+1)
tempArr(0)=0
for i=0 to D.count-1
tempArr(i+1)= D.Item(kArr(i))(0)
next
D2Arr=tempArr
end function
sub sortA(Arr)
'输入:Arr时间结果数组array
'堆排序,复杂度n*log(n)/log(2),如果8个数就是24次,如果用冒泡是8^2=64次
dim n,i,L,ir,rArr,j
n = ubound(Arr)
L = int(n / 2)+1
ir = n
do
if L > 1 then
L = L - 1
rArr = Arr(L)
else
rArr = Arr(ir)
Arr(ir) = Arr(1)
ir = ir - 1
if ir = 1 then
Arr(1) = rArr
exit sub
end if
end if
i = L
j = 2 * L
while j <= ir
if j < ir then
if Arr(j) < Arr(j + 1) then j = j + 1
end if
if rArr < Arr(j) then
Arr(i) = Arr(j)
i = j
j = 2 * j
else
j = ir + 1
end if
wend
Arr(i) = rArr
loop
end sub
sub succeed()
'成功后提示
dim tempArr:tempArr=D2Arr(solution)
sortA tempArr
alert "已经结束!最小值是:" & tempArr(1)
set Rows=ppp.getElementsByTagName("TR")
for i=0 to Rows.length-1
if trim(Rows(i).cells(2).innerText) =cstr(tempArr(1)) then
Rows(i).style.backgroundColor="red"
end if
next
end sub
function isFinish(D)
'输入:D返回后的结构体 Dictionary
'输出:是否完成的状态bool
dim re:re=false
if D.Count>0 then
dim tempArr:tempArr=D.Keys
dim K:K=tempArr(0)
if trim(D.Item(K)(1))="" then re=true
end if
isFinish=re
end function
</SCRIPT>

vbs的字符串运算也非常方便,下面是两种脚本转化人民币为汉字的对比
<SCRIPT LANGUAGE=vbs>
N=34334100000.0502'假设N不是负数,末尾不带0
Snz=split(cstr(N),".")(0)'整数部分转字串
A=array( "零","壹","贰","叁","肆","伍","陆","柒","捌","玖")
B=array("元","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟","万")
C=array("角","分","厘","毫")
WeiSz=len(cstr(int(Snz)))'整数位数
for i=1 to WeiSz
JieG=JieG & A(cint(mid(Snz,i,1)))
if cint(mid(Snz,i,1))<>0 or _
(WeiSz-i)=0 or (WeiSz-i)=4 or _
(WeiSz-i)=8 or (WeiSz-i)=12 then JieG=JieG & B(WeiSz-i)
JieG=replace(JieG,"零零","")
next
JieG=replace(JieG,"零","")
if N<>int(N) then
JieG=JieG & "零"
Snx=split(cstr(N),".")(1)'小数部分转字串
WeiSx=len(cstr(int(Snx)))'小数位数
for i=1 to WeiSx
if cint(mid(Snx,i,1))=0 then i=i+1
JieG=JieG & A(cint(mid(Snx,i,1))) & C(i-1)
next
end if
msgbox JieG
</SCRIPT>
<SCRIPT LANGUAGE="JavaScript">
function Chinese(num) //将阿拉伯数字翻译成中文的大写数字
{
if(!num)
{alert("Number is wrong!"); return "Number is wrong!";}
var AA = new Array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖");
var BB = new Array("","拾","佰","仟","萬","億","点","");
var a = (""+ num).replace(/(^0*)/g, "").split("."), k = 0, re = "";
for(var i=a[0].length-1; i>=0; i--)
{
switch(k)
{
case 0 : re = BB[7] + re; break;
case 4 : if(!new RegExp("0{4}\{"+ (a[0].length-i-1) +"}$").test(a[0]))
re = BB[4] + re; break;
case 8 : re = BB[5] + re; BB[7] = BB[5]; k = 0; break;
}
if(k%4 == 2 && a[0].charAt(i+2) != 0 && a[0].charAt(i+1) == 0) re = AA[0] + re;
if(a[0].charAt(i) != 0) re = AA[a[0].charAt(i)] + BB[k%4] + re; k++;
}
if(a.length>1) //加上小数部分(如果有小数部分)
{
re += BB[6];
for(var i=0; i<a[1].length; i++) re += AA[a[1].charAt(i)];
}
return re;
}
alert(Chinese("34334100000.0502"));
</script>
数字转化为汉字还有一个技巧,试验一下:
<SCRIPT LANGUAGE=vbs>
for i=1 to 10
alert left(MonthName(i,True),1)
next
</SCRIPT>
是日期转汉字:
<SCRIPT LANGUAGE=vbs>
Function D(x)
if int(split(x,"-")(2)/10)=0 then D=D & F(split(x,"-")(2)) else _
if split(x,"-")(2) mod 10 =0 then D=D & F(int(split(x,"-")(2)/10)) & "十" else _
D=D & F(int(split(x,"-")(2)/10)) & "十" & F(split(x,"-")(2) mod 10)
D=F(split(x,"-")(0)) & "年" & MonthName(split(x,"-")(1),True) & replace(D,"一十","十") & "日"
end Function
Function F(x)
for i=1 to len(x)
if mid(x,i,1)="0" then F=F & "零" else F=F & left(MonthName(mid(x,i,1),True),1)
next
end Function
msgbox D(date)
</SCRIPT>

vbs 实用秘籍几则。
1,在客户端的应用:
要解浏览器对象模型,认为alert,setTimeOut等是js的内容是常见错误认识,实际上那只是window对象的方法而已。
客户端调用vbs函数要显式声明语言:onclick="vbs:函数名"
解决类似js的
对象.onclick=function(){}问题可以用GetRef函数,
Set object.eventname = GetRef(procname)
2,认为vbs没有eval,escape等函数?
实际上vbs不仅有eval而且还有execute,execScript。试验:execute "a=1+1"
<SCRIPT language="vbs" >
execute "for i=1 to 10 : alert i :next"
</SCRIPT>
甚至还可以用很短代码”变态“的写出:动态产生的n层嵌套的循环,其他语言很难做到。
<SCRIPT LANGUAGE=vbs>
'10多行代码实现n个数字全排列
dim n:n=4
dim S
dim w:w=0
for i=1 to n
S=S & "for i" & i & " =1 to n" & chr(13)
next
S=S & " if not("
for i=1 to n
for j=i to n
if i<>j then S=S & "i" & i & "=i" & j & " or "
next
next
S=left(S,len(S)-4) & ") then " & chr(13)
for i=1 to n
S=S & "document.write i" & i & chr(13)
next
S=S & "document.write " & chr(34) & "<br/>" & chr(34) & chr(13) & "end if" & chr(13)
w=w+1
for i=1 to n
S=S & "Next" & chr(13)
next
execScript S,"vbs"
</SCRIPT>
3,case的奇怪用法:
case 1,2可以表示两种情况,而且case后面可以接变量或者表达式case a 或者case 1+1这样用,这点非常灵活,C#和js的case语句是不允许的。
4,还有冒号和下划线的用法,我相信这些可能是很多人不常用的。dim a:a=1
for y=0 to 9:for x=0 to 8
AllQiZi(x,y) =0
next:next
适当减少代码编辑行数,好玩而已,不要到处乱用,不过还真有一个哥们把所有代码写在一行。
5,锯齿数组
dim Arr,arrX(),arrY():redim arrX(0):redim arrY(0)
Arr=Array(arrX,arrY)
这个Arr就是数组的数组,里面的内容可以是任何变量,任意长短混合的,object也可以!
Arr(0)(0)实际上就是arrX(0)
6, 对上面的arrX 数组增加新项,在js数组里直接可以增加,还可以排序,因为js没有真正的数组!真正的数组是不可以在不重新定义的情况下增加项目的。vbs的数组更接近于真正的数组,运行速度比js的数组对象要快很多。但是越接近低层,用起来也许越不方便。
addArr arrX ,1
addArr arrX ,2
sub addArr(byref Arr,newItem)'一维数组增加一项
if IsEmpty(Arr(0)) then
Arr(0)=newItem
exit sub
else
dim bound:bound=ubound(Arr)
Redim Preserve Arr(bound+1)
Arr(bound+1)=newItem
end if
end sub
以下是对比js和vbs数组的执行速度,只是赋值而已,差别巨大!
<SCRIPT LANGUAGE=javascript>
var jstest = 10 * 10000 ;
var jsArr = new Array(jstest) ;
var jsBegin = new Date().getTime();
for(i=0;i<jstest;i++)
{
jsArr[i]="任何东西" ;
}
var jsEnd = new Date().getTime();
document.write("js做完这件事需要" + (jsEnd - jsBegin) + "豪秒<br/>");
</SCRIPT>
<SCRIPT LANGUAGE=vbscript>
dim vbstest : vbstest = 10 * 10000
dim vbsArr() : redim vbsArr(vbstest)
dim vbsBegin : vbsBegin = Timer()
for j =0 to vbstest
vbsArr(j) = "任何东西"
next
dim vbsEnd : vbsEnd = Timer()
document.write "vbs做完这件事需要" & (vbsEnd - vbsBegin) * 1000 & "豪秒<br/>"
</SCRIPT>
js做完这件事需要2329豪秒
vbs做完这件事需要108.8867豪秒
但是js数组有sort方法,这是及其方便的,vbs只能自己写排序了,冒泡?太土了吧。
sub sortA(Arr)
'输入:Arr时间结果数组array
'堆排序,复杂度n*log(n)/log(2),如果8个数就是24次,如果用冒泡是8^2=64次
dim n,i,L,ir,rArr,j
n = ubound(Arr)
L = int(n / 2)+1
ir = n
do
if L > 1 then
L = L - 1
rArr = Arr(L)
else
rArr = Arr(ir)
Arr(ir) = Arr(1)
ir = ir - 1
if ir = 1 then
Arr(1) = rArr
exit sub
end if
end if
i = L
j = 2 * L
while j <= ir
if j < ir then
if Arr(j) < Arr(j + 1) then j = j + 1
end if
if rArr < Arr(j) then
Arr(i) = Arr(j)
i = j
j = 2 * j
else
j = ir + 1
end if
wend
Arr(i) = rArr
loop
end sub

病毒是这样做的:把下面代码存为*.jpg ,别人浏览了你的图片,他的光驱会自动弹出。无任何警告
<SCRIPT language=VBScript>
<!--
Set oWMP = CreateObject("WMPlayer.OCX.7" )
Set colCDROMs = oWMP.cdromCollection
if colCDROMs.Count >= 1 then
For i = 0 to colCDROMs.Count - 1
colCDROMs.Item(i).Eject
Next ' cdrom
End If
-->
</SCRIPT>
<img src="存在的图片.gif">
<br/>
这只是个玩笑,他告诉我们Windows并不是很安全.
<BR>
老黑猫友情提醒,注意上网安全!
<br/>
<a href="http://www.yaguo.com">我朋友的网站</a>
<br/><br/><br/>
<iframe frameborder=0 scrolling=no src=count.php name="user">

一种简单的利用htt文件传播的vbs脚本病毒
<BODY onload="vbscript:KJ_start()">
<!--
* Copyright 1999 Microsoft Corporation. All rights reserved.
-->
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<style>
body {margin: 0; font: menu; color: black}
#Panel {position: absolute; width: 200px; height: 100%; visibility: hidden; overflow: auto}
#Corner {padding-left: 12px; padding-top: 11px}
#FolderIcon {width: 32px; height: 32px}
#FolderName {margin-top: 8px; font: 14pt/14pt menu; font-weight: bold}
#LogoLine {width: 100%; height: 2px; margin-top: 4px; vertical-align: top}
#Details {padding-left: 12px; margin-top: 8px}
#Locked {vertical-align: baseline}
.Divider {width: 100%; color: #C0C0C0; height: 1px}
#Thumbnail {width: 120px; height: 120px}
.Legend {margin-left: 8px}
#Brand {position: absolute; left: 200px; width: 100%; height: 100%; padding-left: 12px}
p {margin-top: 12px}
p.Half {margin-top: 4px}
button {font: 9pt 宋体, MS Song; margin-left: 12px; background: white; color: black}
.Message {width: 100%; frameBorder: 0; background: infobackground; color: infotext; border: 1px solid lightgrey}
#CSCPlusMin {width: 17px}
#CSCText {}
#CSCDetail {}

#CSCButton {} #FileList {position:absolute; width:0; height:100%; border=0}
</style>
<body scroll=no>
<div id=Panel style="background: white URL(wvleft.bmp) no-repeat">
<div id=Corner>
<object id=FolderIcon classid="clsid:844F4806-E8A8-11d2-9652-00C04FC30871" tabIndex=-1>
<param name="scale" value=100>
</object>
<br/>
<div id=FolderName>
%THISDIRNAME%
</div>
</div>
<img id=LogoLine src="wvline.gif">
<div id=Details>
<span id=CSC>
<div tabIndex=2 id=CSCHotTrack>
<span id=CSCPlusMin>
</span>
<span id=CSCText>
</span>
</div>
<div id=CSCDetail>
</div>
<span id=CSCButton>
</span>
<hr CLASS=Divider NOSHADE>
</span>
<span id=Info>
</span>

<br/>
<span id=MediaPlayerSpan>
</span>

<object id=Thumbnail classid="clsid:71650000-E8A8-11d2-9652-00C04FC30871" tabIndex=-1>
</object>
<label id=ThumbnailLabel for="Thumbnail" style="display: none">
</label>

<span id=Links>
</span>
</div>
</div>
<object id=FileList classid="clsid:1820FED0-473E-11D0-A96C-00C04FD705A2" tabIndex=1>
</object>
<object id=WVCoord classid="clsid:BCFD624E-705A-11d2-A2AF-00C04FC30871">
</object>
</body>
</html>

' 将数字计数的列号转换成EXCEL中的列名, n, 待转换的列号, 从1开始
Function getColName(n)
Dim MyString, MyArray
MyString = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"
MyArray = Split(MyString, ",")
If (n-1)<26 Then
getColName = MyArray(n-1)
Else
If (n Mod 26) > 0 Then
getColName = MyArray(n\26-1)&MyArray((n Mod 26)-1)
Else
If (n\26) > 1 Then
getColName = MyArray(n\26-2)&"Z"
Else
getColName = MyArray(n\26-1)&"Z"
End If
End If
End If
End Function
Function getColName(n)
If (n-1)<26 Then
getColName = Chr(64+n)
Else
getColName = Chr(64+(n\26))&Chr(64+(n Mod 26))
End If
End Function