Board logo

标题: [原创] WINDOWS中的脚本 No.05 [打印本页]

作者: Spring    时间: 2010-6-22 18:48     标题: WINDOWS中的脚本 No.05

WINDOWS中的脚本 No.05

之前说了对象的一些基本概念,说到属性和方法都是对象的变量名后面加一个点(.)来连接成的,比如 wscript.echo ,今天来看一个具体的例子,了解如何根据文档的说明自己去学会使用一个对象。

有很多对象是用 CreateObject 直接创建出来的,比如有个对象的名字叫做 Dictionary ,我们可以查到它的相关说明:
Dictionary 对象
请参阅
FileSystemObject 对象 | TextStream 对象
语言
JScript

VBScript

显示所有语言
存储数据键和项目对的对象。

说明
Dictionary 对象等价于 PERL 联合数组。项目可以是数据的任何形式,并存储在数组中。每个项目都与一个具有唯一性的键相联。该键用于取得单个项目,并且通常是整数或字符串,但也可以是除数组以外的任何类型。

下面代码演示了如何创建 Dictionary 对象:

[JScript]
var y = new ActiveXObject("Scripting.Dictionary");
y.add ("a", "test");
if (y.Exists("a"))
   document.write("true");
...
[VBScript]
Dim d   ' 创建变量。
Set d = CreateObject("Scripting.Dictionary")
d.Add "a", "Athens"   ' 添加一些关键字和项目。
d.Add "b", "Belgrade"
d.Add "c", "Cairo"
...
方法
Add 方法 (Dictionary) | Exists 方法 | Items 方法 | Keys 方法 | Remove 方法 | RemoveAll 方法

属性
Count 属性 | Item 属性 | Key 属性

请参阅
FileSystemObject 对象 | TextStream 对象



--------------------------------------------------------------------------------

? 2001 Microsoft Corporation. 保留所有权利。


这个是演示如何创建此类型的对象,而我们如果在继续查找,比如 Item ,可以看到另外的说明:
Item 属性
请参阅
CompareMode 属性 | Count 属性 | Key 属性

应用于:Dictionary 对象 | Drives 集合 | Files 集合 | Folders 集合
语言
JScript

VBScript

显示所有语言
在一个 Dictionary 对象中设置或者返回所指定 key 的 item。对于集合则根据所指定的 key 返回一个 item。读/写。

object.Item(key)[ = newitem]
参数
object
必选项。总是一个集合的名称或 Dictionary 对象的名称。
key
必选项。与要被查找或添加的 item 相关联的 key。
newitem
可选项。仅适用于 Dictionary 对象;对于集合不可使用此项。如果提供了此项,newitem 就是与所指定的 key 相关联的新值。
说明
如果在改变一个 key 的时候没有找到该 item,那么将利用所指定的 newitem 创建一个新的 key。如果在试图返回一个已有项目的时候没有找到 key,那么将创建一个新的 key 且其相关的项目被设置为空。

下面这个例子说明了 Item 属性的用法。

[JScript]
function DicTest(keyword)
{
   var a, d;
   d = new ActiveXObject("Scripting.Dictionary");
   d.Add("a", "Athens");
   d.Add("b", "Belgrade");
   d.Add("c", "Cairo");
   a = d.Item(keyword);
   return(a);
}
[VBScript]
Function ItemDemo
   Dim d   ' Create some variables.
   Set d = CreateObject("Scripting.Dictionary")
   d.Add "a", "Athens"   ' 添加一些关键字和项目。
   d.Add "b", "Belgrade"
   d.Add "c", "Cairo"
   ItemDemo = d.Item("c")   ' 获取项目。
End Function


根据这些说明我们大概就能知道怎么使用这个对象了,再看看它的其他方法,我们可以弄一个脚本,来制作一个实用小工具,数据你可以自己扩充:

【区号查询】
  1. ' 初始化数据
  2. Set d = CreateObject("Scripting.Dictionary")
  3. d.Add "北京", "010"
  4. d.Add "成都", "028"
  5. d.Add "乐山", "0833"
  6. '输入要查询的地区
  7. diming = inputbox("输入要查询的地区", "区号查询", "北京")
  8. '判断是否有该地区的数据
  9. If d.Exists(diming) Then
  10.         code = d.Item(diming)
  11.         MsgBox "你查询的地区(" & diming & ")的区号是:" & code, 64, "区号"
  12. Else
  13.         MsgBox "没有查到该地区的信息!", 48, "错误"
  14. End If
复制代码


而有的对象不是直接用 CreateObject 创建,而是调用其他方法是产生的,比如VBS中有一个叫做 WshShortcut 的对象,他就是我们经常使用的快捷方式文件(*.lnk),利用这个对象我们可以使用VBS来创建或者修改快捷方式文件,在网上搜索相关资料可以看到它的相关说明,它是通过我们之前说过的 WshShell 对象的 CreateShortcut 方法创建的,可以看到示例中创建当前脚本本身快捷方式的代码,
set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
set oShellLink = WshShell.CreateShortcut(strDesktop & "\Shortcut Script.lnk")
oShellLink.TargetPath = WScript.ScriptFullName
oShellLink.WindowStyle = 1
oShellLink.Hotkey = "CTRL+SHIFT+F"
oShellLink.Ic
oShellLink.Description = "Shortcut Script"
oShellLink.WorkingDirectory = strDesktop
oShellLink.Save

查询相关资料很容易就知道是什么意思,我们依葫芦画瓢就能使用这个对象了。

==============================

对象不都是脚本语言本身所有的东西,有很多功能丰富多样的对象都是外界环境提供的,我们知道脚本能够在网页中运行,而浏览器这个运行环境里面又有很多可用的对象,而根据浏览器的不同,它们能提供的对象也不尽相同
比如在本地脚本(*.vbs, *.js, *.wsf)中有WScript对象,但是在浏览器中就没有,而浏览器环境中多了很多已经存在的对象比如 document ,而在不同浏览器中这个对象也不完全相同,有的方法比如 document.getElementById 是通用的,而有的,比如 document.all ,在 Internet Explorer 中能使用 ,而很多其他的浏览器如 Mozilla Firefox 中就不行。

在这里简单地举个脚本在网页中使用的例子,网页源代码如下,你可以保存为 .htm 或者 .hta 文件打开(本例中需要使用地址栏,请先保存为 .htm 的):
  1. <html>
  2.   <head>
  3.     <title>HTML脚本示例</title>
  4.     <script type="text/vbscript">
  5.       ' 检查密码是否符合规范
  6.       Function FunUsernameBlur()
  7.         ' 获取被命名为 password 的对象,即密码输入框
  8.         Set p = document.getElementById("password")
  9.         ' 密码是它的 value 属性
  10.         pwd = p.value
  11.         If Not IsNumeric(pwd) Then
  12.           ' 将密码重置并提示
  13.           p.value = ""
  14.           window.alert("密码只能是数字,请重新输入!")
  15.         End If
  16.       End Function
  17.       ' 点击注册激发此方法
  18.       Function FunReg()
  19.         uname = document.getElementById("username").value
  20.         pwd = document.getElementById("password").value
  21.         If uname = "" Or pwd = "" Then
  22.           window.alert("注册失败!")
  23.         Else
  24.           window.alert("注册成功!" & vbCrLf & vbCrLf & "账号:" & uname & vbCrLf & "密码:" & pwd)
  25.         End If
  26.       End Function
  27.       ' 将密码的检测去掉
  28.       Function FunUnlock()
  29.         document.getElementById("password").onblur = ""
  30.       End Function
  31.     </script>
  32.   </head>
  33.   <body>
  34.     账号:
  35.     <input type="text" id="username" name="username" />
  36.     <br>
  37.     密码:
  38.     <input type="password" id="password" name="password" onblur="FunUsernameBlur()" />
  39.     <input type="button" value="禁用密码检验" onclick="FunUnlock()" />
  40.     <br><br>
  41.     <input type="button" value=" 注 册 " onclick="FunReg()" />
  42.   </body>
  43. </html>
复制代码
我们可以发现网页源代码里面都是一些形如 <title>***</title> 或者 <input *** /> 的东西,我们可以理解为这样就表示一个对象(网页里面叫做元素),在此我们只关注与数据相关的东西,也就是叫做 input 的那些东西。
来看这句 <input type="text" id="username" name="username" /> ,这就能表示一个对象了,意思是它是一个本质为 "input" 类型的对象,它定义了三个属性,type 是 "text",id 和 name 都是 "username",我们暂时可以这么认为,对于这种东西,只要是设置了 id 或者 name,都可以用 document.getElementById("id或name的值") 这个方法来获取它,而 input 这种类型的都有一个属性叫做 value ,很好理解,这个就是他的值了。

脚本可以直接在浏览器地址栏运行,跟用 mshta.exe 运行时格式是一样的,比如在CMD中运行命令行
  1. mshta vbscript:msgbox("asdfghjkl",1,"ss")
复制代码
和在 IE 的地址栏输入mshta后面的参数回车效果是一样的
  1. vbscript:msgbox("asdfghjkl",1,"ss")
复制代码
比如我们要看密码的值,可以在地址栏输入下面的代码后回车
  1. vbscript:msgbox(document.getElementById("password").value)
复制代码
但是我们发现运行之后网页内容可能会没有了,在浏览器环境一般都使用它自带的 window.alert() 方法来显示提示框,这样就不会破坏页面
  1. vbscript:window.alert(document.getElementById("password").value)
复制代码
在地址栏运行脚本,如果要赋值,应当使用 javascript ,因为 VBS 中 = 有歧义,可能造成很大的麻烦,设置账号为 Spring :
  1. javascript:window.alert(document.getElementById("username").value="Spring")
复制代码
好了,我们来分析一下,可以看到我们的VBS脚本全部放在了一个类型是 script 的东西里面包起来,它也有个属性 type 指明了脚本类型是 "text/vbscript",即 “普通文本的VBS脚本”,脚本内容是三个方法,可能你觉得奇怪,这只是定义了方法,自己不会运行的,这里在页面里面有“事件”,你点一个地方按一下键盘或者移动一下鼠标浏览器都会监视到,因此浏览器里面很多都是事件触发来运行方法的,注册按钮那个代码上有一个属性 onclick="FunReg()" ,根据文字意义很容易理解就是在这个按钮被点击的时候执行 FunReg() 方法。
onblur 表示光标焦点离开这个东西时的事件,我们的那个禁用密码检测的方法将 onblur 的值设为空,就不会触发检测的方法 FunUsernameBlur() 了。

关于网页这部分,知识很多,我主要是让大家了解脚本的各种使用,如果有兴趣可以再慢慢学,本教程不会太多的讲这些,不过你要问我肯定很乐意解答。


最后还是出一个题吧:

1. 创建一个“系统热键”,使得当按下 CTRL+W 组合键时,启动CMD命令行窗口,并且默认工作路径(%cd%)在桌面。
(已知 当快捷方式放在 “C:\Documents and Settings\%username%\「开始」菜单\” 文件夹下时热键有效 )

2. 选作题:
在批处理之家(bathome.net)注册一个中文用户名的马甲,回复本贴。


=== No.05 End ===
作者: zqz0012005    时间: 2010-6-23 00:04

感谢楼主分享,鼓励楼主的学习钻研精神!

指出几处不足的地方:

1、“对象”这个概念是通用的,建议楼主去补充一下这方面的知识,然后就会发现你的解释大多是错误的

2、“脚本能够在网页中运行,而浏览器这个运行环境里面又有很多可用的对象”,悄悄说一下,这个“很多东西”叫做DOM(文档对象模型),DOM+CSS+JavaScript+HTML结合起来就叫DHTML,前几年很火爆的一种HTML技术,现在已经普及了。有兴趣的话,楼主也可以去深入了解一下,否则像上面那样理解是很片面的。

3、 “注册一个中文用户名的马甲”,本论坛不提倡将技术用在不实用的地方。而且做坏事会被警察叔叔抓的^_^
作者: zqz0012005    时间: 2010-6-23 21:20

“善意的错误”、“更能让别人理解”。。。

说一下我的感受:
我当初学vbs的时候,就是被很多“教程”误导过。人在学习一种新东西的时候,思维一般都会受“第一印象效应”的影响。因为误导我在很长时间内都不得其法,觉得实在太难了。也因这些教程而有一度错过了真经《Windows 脚本技术》(script56.chm),后来在它的指导下才很快入门。我学vbs总共了用了差不多2年,一是时间、资料等条件所限,二就是因为误导,可惜。

如果能给出正确的解释,为什么不呢?

给出一些表象,却不道出实质,最讨厌的就是露一半藏一半

如果点出这种东西就是DOM,不是更利于大家去查找资料、如果感兴趣还可进一步学习吗?
作者: zqz0012005    时间: 2010-6-23 21:20

知道为什么我们论坛的vbs教程只出了两篇吗?
关于写vbs教程,论坛管理层酝酿了几个月,为了尽量准确,大家也参考了网上的相关资料,但发现网上已有的教程实在太多而且良莠不齐,后来经过辛苦总结,整理了一些我们所找到的最优秀的资料。与这些精华相比,我们觉得,就我们目前的水平,实在难以写出能够超越它们的东西。我们也没有像某些论坛那样,稍作修改就标榜是自己的创作,而是把它们集中放在一个帖子里面(第一节),以供有兴趣者自行查阅。

批处理之家VBS系列教程——第一节 工具与资料
http://www.bathome.net/thread-2382-1-1.html

批处理之家VBS系列教程——第二节 第一个程序“Hello World!”
http://www.bathome.net/thread-2431-1-2.html
作者: neorobin    时间: 2010-6-23 21:51

支持楼主!
与 zqz 有同感
网上已有的教程实在太多而且良莠不齐

因为学的很多东西来自 MS, 确实可以把 MS 的文档作为 "真经", 但 "真经" 可不是用来供奉甚至迷信的, MS 文档同样有着许多的错误和不足,
如果某个教程在某个局部知识面上可以 较之于 MS 资料 更 深入 剖析说明 相关技术, 相对有所补充和纠正. 那就确实是很好了.
作者: zqz0012005    时间: 2010-6-23 22:03     标题: 回复 6楼 的帖子

一直有这个打算,只是工作后没什么时间(几乎每天加班,前不久还在考虑要不要换一份工作)
标题都想好了^_^:《Windows 脚本技术》概要剖析(不敢叫完全剖析)
作者: Spring    时间: 2010-6-23 23:21

哎,看了zqz的一席话才发现自己还是太自以为是了,没想到冠以“教程”二字是要负很大责任的。
其实我本来打算写的关于基础概念知识的理解方面的东西也差不多完了,也不会再有这样的“教程”了。

但是我会继续写一些自己对脚本的理解和经验,以后就叫做“脚本学习经验分享”了,以前说的与批处理对照的东西也要继续。至于脚本在网页中的使用,一方面会涉及很多其他方面的知识,另一方面vbs在网页中,即使hta程序中也不如javascript方便,我自己基本也没用vbs,就不多介绍,教大家做点简单的hta小工具就好了。
作者: Batcher    时间: 2010-6-23 23:26     标题: 回复 8楼 的帖子

楼主乐于分享的精神是值得大家学习的
作者: xiaoshiwei    时间: 2010-8-14 11:00     标题: 收藏了了本贴

当今社会,金钱至上,物欲横流,以致人心浮躁。
能够像楼主这样子静下心来“为人民服务”的人为实不多,顶力支持,虽然我是超级新手,也没看完你的教程。
zqz0012005版主的话也颇有道理,因为之前我就对着众多教程,不知作何选择。

总面言之,两位的出发点都是好滴。
致敬 !
作者: wc726842270    时间: 2010-12-8 20:10

这5篇都是经典啊,只可惜那些老人已经不再这里了,有些门廷冷落了啊




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2