[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[技术讨论] 漫话vbs学习感悟

vbs与com的关系:
     vbs是扳机,com 是你的子弹,没有com的vbs脚本,就是一把没有子弹的枪。
     枪没了子弹,杀人时,你就只有赤膊上阵了,当然赤膊上阵也是可以杀人的。



     扣动你的扳机,射出一幅美丽的图像
                 再次刷新网页,显示动画




欢迎跟帖。贴出你,我,他---
在vbs学习中的感悟,
对与错并不重要,重要的是大家在一起讨论,学习。
没有错误,何来正确!
在学习中一起成长,
在讨论中一起丰富我们对vbs的理解。
贴出你的感悟------------
让大家一起分享!

让我们一起从不同的角度去欣赏美丽的vbs吧
特别提醒:脚本尽量采用短脚本。代码不求完美,只要能说明一个问题就可以了。
=================================================

1--结束vbs的while...wend循环。
  1. t=1
  2. j=0
  3. while t<2
  4.   wscript.echo j&"--", t
  5.   j=j+1
  6.   if j>10 then t=2
  7. wend
复制代码
-------------------------------
vbs入门级教程 http://www.bathome.net/thread-11581-1-1.html
--------------------------
msgbox 的返回值 http://www.bathome.net/thread-11613-1-1.html
----------------------------
密码输入
http://www.bathome.net/thread-11595-1-1.html
------------------------------------------
cmd中输入的长脚本 http://www.bathome.net/thread-11589-1-1.html
-----------------------------------------
mshta标准用法
http://www.bathome.net/thread-11516-1-1.html

-----------------------------
创建环境变量
http://www.bathome.net/thread-11514-1-1.html


------------------------------
getref函数
http://www.bathome.net/thread-11484-1-1.html

------------------------------
连续截取文本 http://www.bathome.net/thread-11469-1-1.html
----------------------------------------------
关于regsvr32--- 脚本部件问题
http://www.bathome.net/thread-11386-1-1.html
------------------------------------------------------------------
创建vbs中的类:http://www.bathome.net/thread-11318-1-1.html
---------------------------------------------------------------------------
cmd的全屏问题
http://www.bathome.net/thread-11289-1-1.html

---------------------------------
正则表达式
http://www.bathome.net/thread-11223-1-1.html
------------------------------------------------
系统是winxp吗?
http://www.bathome.net/thread-11179-1-1.html
---------------------------------------------------
读出文本
http://www.bathome.net/thread-11165-1-1.html
----------------------------
wsh对象模型:一张经常看的图片,黄色的代表对象是有属性生成,这样的对象是集合对象。
访问的方法如下:
for  each  i in  set
  ......
next
=========================================
转帖 值得一看的vbs文章
http://www.hongkejidi.com/wz/ShowClass.asp?ClassID=337&page=1


大力推荐给玩家一个com:shotgraph画图组件,下面的test1.gif就是有这个组件做的,刷新网页,你可以看到运动的圆
语法请参考第2页下方。跳转到第2页http://www.bathome.net/thread-11615-2-1.html

下载http://aspxhome.com/article/uplo ... 200792612313895.rar
1

评分人数

本帖最后由 myzam 于 2011-3-27 12:01 编辑

vbs问题:
1. 如何在cmd中画出抛物线y=x*x   ?
2.如何从字符串 str="2011-11-30 12:50:33"
中提取年,月,日,时,分,秒?
3. 如何把数字 num=12345转化为 num=$12345.0000 ?
4.如果a.txt,b.txt被打开,如何聚焦到指定的文件如a.txt?
5. 已知字符串 str="z:\gg\ff\my.extend", 如何从str中提取:z,z:,my,extend,my.extend?
6.已知 p1="z:\gg\ff",p2="\rr\uu.txt",如何合并路径p1与p2?

TOP

本帖最后由 myzam 于 2011-3-27 17:12 编辑

2# myzam
假设f盘有一文件叫 20.txt其属性设置为只读且存档,
现在要用vbs显示这两个属性。方法如下:
  1. set fso=createobject("scripting.filesystemobject")
  2. set file=fso.getfile("f:\20.txt")
  3. t=file.attributes
  4. set dic=createobject("scripting.dictionary")
  5. dic.add 0,"normal"
  6. dic.add 1,"readonly"
  7. dic.add 2,"hide"
  8. dic.add 4,"system"
  9. dic.add 32,"achive"
  10. wscript.echo dic(t and 32),dic(t mod 32)
复制代码
---------------------------------
返回驱动器的文件系统
  1. set fso=createobject("scripting.filesystemobject")
  2. set file=fso.drives
  3. on error resume next ‘由于有光驱的存在,没有这句将返回驱动器没有准备好这一结果。
  4. for each i in file
  5. wscript.echo i.filesystem
  6. next
复制代码
resume单词的英文意思:假定,认定。
如假定x是大于2的数:Resuming x is greater than 2

题外话:如果是学数学的 用过专业的数学软件maple,那里面就有大量的 resume这个单词的用法。

--------------------------------------------------------------------------------------------
显示桌面文件有哪些?有多少。
  1. set obj=createobject("wscript.shell")
  2. set fso=createobject("scripting.filesystemobject")
  3. path=obj.specialfolders("desktop")  ‘获取桌面路径,可以直接输入
  4. set folder=fso.getfolder(path)
  5. set files=folder.files
  6. for each i in files
  7.     wscript.echo i.name ’获取文件名
  8. next
  9.    wscript.echo files.count  ‘获取文件数量
复制代码

TOP

5# wc726842270
对的。
刚开始接触msgbox时,点确定和取消按钮,效果都一样。
于是就想怎么做才可以让点击确定去执行a代码,点击取消就去执行b代码。
于是就 想 msgbox在运行后是不是有一个放回值。
这样就设计了下面的测试代码:
  1. t=msgbox("hello world",vbyesno,"我的测试")
  2.       wscript.echo t
复制代码
发现有放回值是6,7.

另外,bat中有很强的字符串截取功能。在vbs中也有,只是功能不那么强大。
下面几个fso对象的方法就具有字符串截取功能
getbasename
getdrivename
getextensionname
getfilename
getparentfoldername

p="k:\gg\uu\ha.abc"
set fso=createobject("scripting.filesystemobject")
wscript.echo fso.getdrivename(p)

-------------------------------------------显示驱动器类型
  1. set oshell=createobject("wscript.shell")
  2. set fso=createobject("scripting.filesystemobject")
  3. set drives=fso.drives
  4. for each i in drives
  5.   
  6.   if (i.drivetype mod 4)=0 then wscript.echo i&"It is CD"
  7.   if (i.drivetype mod 4)=1 then wscript.echo i&"It is flappy"
  8.   if (i.drivetype mod 4)=2 then wscript.echo i&"It is hard-disk"
  9. next
  10.    wscript.echo "Drives-count="&drives.count
复制代码
运行结果如下图

TOP

本帖最后由 myzam 于 2011-3-27 22:26 编辑

7# Batcher
怎么可能没看呢。我都看了几遍了。不知道为啥,参加vbs讨论的人那么少。我就是想把人气弄起来再说。有了人啥都好办嘛。

TOP

本帖最后由 myzam 于 2011-3-28 19:23 编辑

9# wc726842270


     我在大学里面学的是basic ,fortran。那时我没电脑。我印象最深刻的是我算一个数值积分,程序运行了近4分钟才算完,那时的电脑是TR-80机,真的好慢,还有一次我参加抽签考试,看的是编程打到三角,平时我都会的,到哪参加考试时紧张,直到时间要用完时才编号,好险。后来工作了有电脑了。弄了点dos。之后弄了点vb。后来别人告诉我,要牛逼就去学vc,而学delphi是
明智的选择,于是又去弄了弄delphi。结果是什么都没学好。在后来由去弄了下汇编。乱七八糟的弄了一大堆,到头来我是什么都没学好。
其实,说穿了还是工作中用不了多少。工作中能常用的就记的住。我在想,大学里面学的basic到现在我都还能记住,
更本原因是工作中,我有时要用来数值计算。其它的老是忘记,所以学好查手册我觉得是最好的办法。vbs越看越觉得是无底洞。
我都在想这个世界上有没有对vbs精通的人存在了。vbs的语法和20年前的basic语言差不多。但是是现在的vbs功能太强大,几乎是无所不能。
现在想想其实学什么语言都差不多。现在的高级语言都有共性。人的精力是有限的,专心一门语言就可以了。如果感觉精力旺盛,可以再去了解
一下其它的语言。
学编程其实也是不误正业,我觉得就和有的人喜欢打牌是一个道理。呵呵。
  现在的高级语言分为B,C,D(BASIC,C,DELPHI),这个世界上有没有人精通这三门语言的?真的不知道有没有。
微软的vb(vbs)是比较易懂的一门语言,感谢微软,它带着我们走进了现代的面向对象的编程。
所真的bat真的很古老,它不是面向对象的。如果只学bat那就意味着永远都停留在古代。我不是说古代就不好。
学bat之于,也学一点现代一点的高级语言。我想这是一种不错的选择。

TOP

11# wc726842270


我觉得可以。mshta是hta的宿主,专门用来解释hta文件的。而hta文件里面是可以嵌入脚本的,可以嵌入脚本就可以调用run(或exec)方法。而调用run就可以执行
bat文件。但我没试过。

TOP

13# myzam


        今天上网看写或读取剪切板的内容。方法真是很多。但看来看去,思路大致都是利用复制,粘贴去获得,写读剪切板的内容。真的是万紫千红。
有一种方法我觉得是不错的,一个网页文件里面可以嵌入文本框对象,而有文本框对象就可以进行复制与粘贴。这就隐含了读写剪切板。
     于是打开注册表在根键HKCU(这里注册的是classes=类),这是一个与类有关的键。网页中的按钮啊,文本框啊常这么写:
<form>
   <input type='text'/>
     <input type='button'/>
</form>
这里就在网页里面嵌入了一个窗体对象。所一我在HKCU键里搜索,就发现了一大堆与窗体有关的类,
如:forms.form.1,-forms.textbox.1,比照网页文件里面的窗体与文本框的关系,我想窗体是父类,文本框是子类,于是参考了其它的脚本,写下了下面的脚本,测试成功,离开了网页,文本框对象我们可以创建,但是你看不到。只有依附于网页等,你才可以显示出文本框!所以文本框的属性和网页中的是一样的。因为,你更本调用的就是网页中的那个文本框。
发到这里分享。
  1. set oform=createobject("forms.form.1") '创建窗体对象
  2. set  otextbox=oform.add("forms.textbox.1") '创建文本框对象
  3. otextbox.value="hello world"  '赋值给文本框
  4. otextbox.selstart=0
  5. otextbox.sellength=8 '以上两句是选择文本框里面的内容
  6. '如果你是用的是多行文本框,就加这样一句:otextbox.multiline=true
  7. otextbox.copy
  8. wscript.echo otextbox.textlength '显示一下我选中的文本长度。
复制代码
------------------------------------
读取剪切板内容 Clipboard Text  read by Textbox
  1. set oform=createobject("forms.form.1")
  2. set otextbox=oform.add("forms.textbox.1")
  3. otextbox.paste
  4. wscript.echo otextbox.value
  5. 'value属性和text属性的效果一样
复制代码
在理解上面的代码上,你想象中在进行html文件的编写。你在编写一个窗体,窗体里面有嵌入了一个文本框,这样代码就好理解了。


到这里我才发现原来网页中用的那些对象原来可以按照这样的方法脱离开网页而生存下去。
我还得测试一下能不能直接使用文本框对象,也就是说不创建窗体对象可以不?网页中是可以的。但是网页中是不是在隐含的使用文本框对象呢?
测试好了在贴。
经测试,发现不行,这说明如下的网友代码:
<input type='text'/>
虽然没有显示的创建窗体,但是html是在后台默默的创建了窗体的。


一点思考:不一定对。我猜测窗体com是按类似于如下的方式组织的:


<package>
   <component id='forms.form.1'>
       <public>
                      <method  name='add'>
              ...
       </public>
       <script language=vbs>
                  set  add=createcomponent("forms.textbox.1")

      </script>
   </component>
   <component id='forms.textbox.1'>
        <public>
             <method id='paste/'/>
              <method id='copy'/>

       </public>
        <script language=vbs>
              function paste
                     ....
             end function
               function copy
                     ....
             end function

         </script>
        ......
   </component>
     <component id='button'>
        ......
   </component>

</package>


---------------------------------------
所以vbs才会这样调用com

set  form=createobject("forms.fomr.1")
set textbox=form.add("forms.textbox.1")
。。。。。。
这样的嵌套结构就决定了,一定要先创建窗体form,然后才能调用textbox对象。

-------------------------------------------------
一个有趣的问题:
   set form=createobject("forms.form.1")
set textbox=form.add("forms.image.1")
textbox.picture=loadpicture("f:\sunset.jpg")
for i=1 to 5
   wscript.echo hex(textbox.picture)
next
按上面的方式运行结果是数字,这些数字代表什么呢?
---------------------------
我突然来了点灵感:
显示的数字是8位16进制,我认为前4为为line,后4位为column。代表图片的行列大小。
对于loadpicture的认识,有了一点认识。就是可以用来获取图片的高宽。
如:
  set t=loadpicture("f:\sunset.jpg")
   wscript.echo t.width,t.height
这个函数居然可以创建对象。好奇怪。但是这样得到的值和真实的快高不一样,图片是800x600,于是把获得的数字t.width除以800,得到了26.45875,
修改上面的程序
   set t=loadpicture("f:\sunset.jpg")
   wscript.echo int(t.width/26.45875),int(t.height/26.45875)
再运行,发现基本是
800x600,于是信心大增,把int该为round函数,居然对上号。于是有拿第二张图片测试,这次通过了。但是t返回的数值代表什么呢?还在思考中。
当然在网页中有图片框时这个函数的用法很简单,用法如名。

TOP

郁闷。
为啥学bat的人那么多。学vbs的那么少。
vbs无论从入门,到功能都比bat强很多。郁闷。
我想是不是因为vbs里面的英文太多了。

TOP

今天上网逛,看到一个vbscom非常好。这是一个画图组件。生成的图像非常漂亮。
组件名叫shotgraph,下载地此为http://aspxhome.com/article/uplo ... 200792612313895.rar
给出一个生成gif的程序:
  1. set obj=CreateObject("shotgraph.image")
  2. size=201
  3. 'Calling the CreateImage method
  4. obj.CreateImage size,size,4
  5. '4是指图像中要用到4种颜色,颜色按编号引用
  6. obj.SetColor 0,255,255,255
  7. obj.SetColor 1,0,0,0
  8. obj.SetColor 2,255,108,0
  9. obj.SetColor 3,0,0,204
  10. '0~3代表颜色编号,后面的三个数字是rgh数。
  11. obj.SetBgColor 0
  12. obj.FillRect 0,0,size-1,size-1
  13. '画正方形,填充色是编号为0的颜色,后面的是对角线坐标。程序有错误,颜色编号只能从1开始,不能用0,后面的语句和这句一样的道理。
  14. obj.SetDrawColor 1
  15. 'Drawing the line
  16. obj.Line size-1,0,0,size-1
  17. 'Color 2 will be used for filling
  18. obj.SetBgColor 2
  19. 'Draw the big circle
  20. obj.Ellipse 5,5,size-6,size-6
  21. 'Color 2 will be used for filling
  22. obj.SetBgColor 3
  23. 'Draw the small circle
  24. obj.Ellipse 5,(size-5)/4,size/2,(size-5)*3/4
  25. 'Create the image file named test.gif
  26. obj.GifImage 0,1,"test.gif" '图片可以保持为一切windows图片,包括swf文件也可以。
复制代码
上面的代码生成的图片如下:有了这个画图组件,利用vbs画函数的图像的问题就解决了。利用这个com去生成图片,用windows图片查看器去
不断的显示图片,真的在vbs里面画图很完美了。shotgraph很小,小到安装时你都不没感觉。

最大的遗憾是图片的长宽受限制。其它的都非常好。


===========上面的语句有问题==下面的为正确的===========================
  1. set obj=createobject("shotgraph.image")
  2. obj.createimage 300,200,3
  3. obj.setcolor 1,0,255,0
  4. obj.setcolor 2,0,0,255
  5. obj.setbgcolor 1
  6. obj.fillrect 0,0,300,200
  7. obj.setdrawcolor 2
  8. obj.line 0,0,200,200
  9. obj.gifimage 0,1,"test.gif"
复制代码
==================================运动的直线
  1. set oshell=createobject("wscript.shell")
  2. set obj=createobject("shotgraph.image")
  3. obj.createimage 300,200,3
  4. obj.setcolor 1,0,255,0
  5. for i=0 to 20
  6. obj.setdrawcolor 1
  7. obj.line i,i,400-i*i,i*i  '改为 obj.line i,i,i,i 就是点
  8. obj.gifimage 0,1,"test.gif"
  9. wscript.sleep 500
  10. oshell.run "test.gif"
  11. next
复制代码
要申请金山快盘的 请点我的邀请链接,我也好到金上去弄2分。谢谢支持哦。
要请链接为&nbsp;&nbsp;&nbsp;&nbsp; 推荐金山快盘,5.6G的免费空间,可以存照片、文档等,可以自动同步快盘里的文件,在哪都能编辑使用,不怕硬盘损坏,系统崩溃,电脑丢失,病毒破坏等,文件永不丢失的网络硬盘!非常喜欢! &nbsp;&nbsp;&nbsp;&nbsp; 点击下面的的地址立即试用:   http://k.wps.cn/register/?invite=dbkvsx
=====================动态的画抛物线, 特别注意,支持小数步长,如step 0.05
  1. set oshell=createobject("wscript.shell")
  2. set obj=createobject("shotgraph.image")
  3. obj.createimage 300,200,3
  4. obj.setcolor 1,0,255,0
  5. for i=0 to 100
  6. obj.setbgcolor 1
  7. obj.fillrect i,i^2*0.02,i+1,i^2*0.02+1
  8. obj.gifimage 0,1,"test.gif"
  9. wscript.sleep 500
  10. oshell.run "test.gif"
  11. next
复制代码
1

评分人数

TOP

17# wc726842270
我那天有时间时,我更新一下,给出点简单清楚的实例。
对了,你问的4色,是指你的图片中要用的4色。
rgb的r是red,g是green,b是blue。

TOP

本帖最后由 myzam 于 2011-4-1 21:06 编辑

shotgraph图像组件的用法,
   
1--create image object
   set oimg=createobject("shotgraph.image")
2--image对象的方法
   createimage 方法:   oimg.createimage(size1,size2,num)
   设置要创建的图片文件的尺寸大小为size1 x size2,size1<=320,size<=240.
   大于这个数的按这320或240计算。
   num设置要创建的图片文件里要使用的颜色个数,这里是颜色个数可以认为的指定,如你的图片要用5个颜色就指定5个,这5个颜色是你配置好的颜色,不要错误的理解为是5个基本的色素。每个颜色通个方法
   setcolor定义。
  
   gifimage 方法:oimg.gifimage bgcolor,forcolor,path
   path表示创建的图片文件要存放的路径。保存的图片格式是一切windows图片格式包含swf也可以。
   bgcolor背景色,取逻辑值,这里是比较宽松的
   非0等价于true,0等价于false。
   如:set oimg=createobject("shotgraph.image")
           t=oimg.createimage (200,200,3)

           oimg.setcolor 0,255,255,200

           oimg.gifimage 1,0,"test.gif"
           背景是通过setcolor 0来定义的,必须是0
           要应用背景gifimage必须是是1,*
           要屏蔽背景色必须是0,*。你也可以直接使用 vb常数true,false。
    绘制线方法: line x,y,x+h,y+k
                 x,y代表对角线起点坐标,h,k代表长,宽。
    绘制点的方法:line x,y,x,y
    绘制椭圆和园的方法:ellipse x,y,x+h,y+k
    绘制正方形的方法:fillrect x,y,x+h,y+k
    填色的方法
    绘制线,点时,设置颜色的方法是 setdrawcolor num
    num 为setcolor定义的颜色编号。
    绘制圆,椭圆时,设置颜色的方法是 setbgcolor num
    num的含义同上。
    setcolor定义颜色的方法:setcolor num ,red,green,blue
    num为颜色编号,0分配给图片背景使用。1,2,...分配给点,线,椭圆,圆,长方形使用。

  既然我说的是方法,请注意方法的用法是 oimg.method. 它们不是函数是方法!
  如果你要去返回值就这么用 t=oimg.method () .
  再次提醒注意:未注册版本生成的图片大小为320x240,能不能突破这个限制,网上说注册就行,
经过我试验不必要,你只要把图片保存为swf格式就可以了。
看实例:
  1. set oshell=createobject("wscript.shell")
  2. set oimg=createobject("shotgraph.image")
  3. x=200
  4. y=200
  5. oimg.createimage x,y,8
  6. oimg.setcolor 0,255,100,12
  7. oimg.setcolor 1,125,0,0
  8. oimg.setdrawcolor 1
  9. oimg.line 50,50,100,100
  10. oimg.gifimage 1,0,"test.swf"
  11. oshell.run "test.swf",3
复制代码
利用循环语句把步长设置为小数,将得到高精度图像。

TOP

本帖最后由 myzam 于 2011-4-1 21:08 编辑

20# wc726842270

好掌握啊。比如你的图片大小是200x100,你的图片是矩形框。从左上角开始的坐标为0,0,左下角的坐标就是200,100.
我把你推荐的书下来看看。

TOP

本帖最后由 myzam 于 2011-4-2 22:00 编辑

估计是。呵呵。
对了,这个控件还可以创建文字
  1. set oshell=createobject("wscript.shell")
  2. set oimg=createobject("shotgraph.image")
  3. x=200
  4. y=200
  5. oimg.createimage x,y,8
  6. oimg.setcolor 0,255,100,12
  7. oimg.setcolor 1,125,0,0
  8. oimg.setcolor 2,255,255,200
  9. oimg.fontsmoothing=2
  10. oimg.textout 50,100,"hello world hello world"
  11. oimg.gifimage 1,95,"test.swf"
  12. oshell.run "test.swf",3
复制代码
创建字体画的语法(保存为swf,这样可以突破尺寸大小为320x240的限制):
  1. set oshell=createobject("wscript.shell")
  2. set oimg=createobject("shotgraph.image")
  3. x=800
  4. y=600
  5. oimg.createimage x,y,8
  6. oimg.setcolor 0,255,100,12
  7. oimg.setcolor 1,125,0,0
  8. oimg.setcolor 2,255,255,200
  9. oimg.createfont "Arial",50,72,100,false,false,false,false
  10. oimg.textout 10,20,"hello"
  11. oimg.gifimage 10,0,"test.swf"
  12. oshell.run "test.swf",3
复制代码
语法:
1--设置字体属性 ,line取逻辑值,这里的逻辑值比较松,true为非0,false为0
oimg.createfont "font-family",charactorset,size,rotation,line1,line2,line3,line4
2--字体位置:
oimg.textout  leftposition,topposition,"text,text can be chinese"
3--字体颜色
   由oimg.setcolor num,red,green,blue 定义颜色
   由oimg.settextcolor num 把编号为num的颜色应用到字体上。
完整的语法为:createFont sFamily, nCharset, nHeight, nAngle, bBold, bItalic, bUnderline, bStrikeOut [,bUnicode]

TOP

本帖最后由 myzam 于 2011-4-1 22:43 编辑

你说的一点都没错。
对我来说我就只关心画函数图象。其它的对我用处都不大。我看其它的只是了解它吧了。说真的要说方便把vb一架就解决问题了。用不了这么繁杂的。
html那东东是看不会的。建个网站,在用中才能学会。
vbs手册就算看一万次,还是学不会vbs的,除非去用。
就像看不会数学一样,你就算把数学书看破了,也学不会数学的,不是吗?学数学我们都知道要学习数学的各个分支,如果对数学分析感兴趣,就只学习数学分析,而对射影几何一点都不了解那是不行的,要想学习数学,出了做数学题外,不会有更好的方法。
所以学校vbs不在全局上对vbs做个大概的了解,我觉得是不行的。学习脚本部件,学习hta,
其实就是从不同的角度去了解vbs。最后是各人取自己感兴趣的去学习。

TOP

返回列表