因为过年, 一直没有更新教程. 发现按照这个进度得下个世纪能完成我这宏伟的小计划, 所以最近我会加快进度. 好多人问我学习方法, 其实真的是学习没有捷径. 最后说一句, 学习脚本最好准备一份帮助文档, vbs就下载script56.chm这个文件就行了.

=========================万恶的分割线后开始正题==========================

第二章. 运行脚本

 

本章重点

 

现在是时候开始运行我们的脚本了, 更重要的是学会如何编辑我们的脚本. 在本章, 你将了解到多种执行脚本的方法, 并了解创建和编辑脚本的细节. 您还可以完成自己的第一次脚本体验.

 

假设你有几个脚本准备去运行, 你将如何处理它们? 加载这些脚本到Visual Basic中并且去编译它们? 你怎样将它们分发给终端用户并用作用户的登录脚本? 当你准备开始编写脚本时, 你将如何去做? 有什么可以使用的工具可以用, 以及如何使用? 本章的目的是介绍给你一些脚本工具, 利用它们去编写, 运行, 修改, 调试你的管理脚本.

 

Windows 脚本宿主(Windows Script Host)

最常用的运行脚本的方式是使用WScript.exe, 这是一个图形化的Windows脚本宿主(WSH), 我们已经在第一章中介绍国它. WScript通常默认与脚本的扩展名相关联, 所以直接双击即可运行脚本. 例如扩展名为VBS的文件.

尝试下下面的动作过程:

1. 鼠标右击你的桌面, 然后选择新建一个文本文档.

2. 重命名这个新建文本文档为 Sample1.vbs.

3. 右击这个文件选择编辑. 默认情况下Windows会自动使用记事本来打开这个文件.

4. 编辑内容为WScript.Echo “Displaying Output” 并保存.

5. 关闭记事本.

6. 在桌面上创建另外一个新建文本文档, 并重命名为Sample2.vbs.

7. 编辑Sample2.vbs内容如下:

Wscript.Echo “Here we go…”

Dim V

V = InputBox(“What is your name?”)

MsgBox “Hello, ” & V

这些都不是很复杂的脚本, 但它们有助于说明一些重要的概念. 首先, 双击Sample1.vbs. 如果您的系统配置正确, 会看到类似图1的一个对话框. 点击确定关闭对话框且结束第一个脚本. 然后, 我们双击Sample2.vbs. 它会启动一个类似图2的对话框. 最后如图3, 会提示输入你的名字.

clip_p_w_picpath001 图1

clip_p_w_picpath002 图2

clip_p_w_picpath003 图3

最终你会看见如图4这样的对话框, 并把你输入的名字显示出来.

clip_p_w_picpath004 图4

提示: 你刚刚看到的就是大概所有的VBS可用图形控件. 如果你想创建非常复杂的图形控件, 那么请放弃VBS, 你需要类似于VB.NET这样的强大语言.

从上面的演示你发现了什么? 首先, 你已经体验到了VBS为用户提供的图形化接口: 基本的输入输出. 了解到了创建一些看起来貌似有些复杂的带有Yes和No按钮的对话框, 实际上还可以带有Abort, Retry, 和Ignore按钮, 但是那不是我们本章关心的问题仅仅是一些函数参数的设定而已.

这个脚本非常简单, 你应该能够找出每行代码的作用. WScript.Echo显式的显示了一个带有文本的对话框, 在上面的两个示例脚本中都有使用.Dim V 是创建了一个名字为”V”的变量(关于变量我们会在以后的章节中讨论), 还有InputBox函数收集了一些信息并将此信息传递到变量”V”中. 最终MsgBox看起来似乎与WScript.Echo一样在对话框中显示了变量”V”中的信息.

说到这里, 你最关心的是否是”WScript.Ech和MsgBox到底有什么区别?” 实际上它们确实是不同的, 虽然只是很微妙.

脚本的命令行形式

大多数时候, 你肯定比较喜欢使用WScript.exe去执行脚本. 然而还有另外一种WSH, CScript.exe, 这是一个命令行的脚本执行宿主, 我相信在某些情况下你会痴迷于它.

CScript的不同之处在于它不提供给用户任何非图形化的输入方式. 换句话说, 虽然你可以使用CScript来在一个命令行中显示输出, 但是你不能使用它从命令行来接收输入(PS: 当让不是绝对的, 因为是微软的老文档, 所以可能当时是这样的, 历史就不考究了). 试试下面的例子, 你会明白我的意思的:

1. 打开一个命令行窗口.

2. 更改当前执行目录到桌面文件夹.

3. 输入 Cscript sample1.vbs.

你应当看见了如图5所示的命令行输出. 当使用WScript.Echo执行这个脚本时会弹出对话框. 当使用CScript.exe仅在命令行下输出. 这也就允许你创建一个既可以执行在图形化下又可以在命令行下的脚本. 这种编写脚本的技术将适应每个环境.

clip_p_w_picpath006 图5

我们再来使用同样的方法执行Sample2.vbs. 刚开始时你会看到一个类似于图6的的命令行, 是一个简单的显示例子中的WScript.Echo输出. 然而, CScript将执行InputBox函数, 它被切换为图形模式, 如图7所示, 就像使用WScript一样. 最后, MsgBox命令同样被强制转化为一个图形化的输出对话框, 如图8所示, 准确的说这和WScript的执行结果是一样的. 只有WScript.Echo是多模式的, WScript和Cscript对它的执行结果是不同的. 其他一切的控件都会默认执行成图形化模式.

clip_p_w_picpath008 图6

clip_p_w_picpath009 图7

clip_p_w_picpath004[1] 图8

为什么要关心这样细微的差异? 有一天, 你可能要编写一些要在后台执行的任务计划或者一些其他的工具. 这总是一个好的解决办法, 脚本输出一些信息让你可以看到你的脚本都在做些什么, 这样你就可以有目的的调试你的脚本了. 如果你使用的是WScript.Echo来输出, 并且使用WScript来运行它, 你将不得不为每个输出信息来点击OK来达到让脚本继续的目的. 当你要后台运行脚本时, WScript就不是一个好的选择了, 因为你不能在后台执行你的点击动作. 可以使用CScript来代替, 你的输出仍将显示(即使无法看到后台的命令行), 脚本不会等待点击确定来继续执行. 如果你使用MsgBox, CScript将显示一个对话框, 如果不点击OK你的脚本将停止运行(PS: 其实是可以通过MsgBox的超时参数来实现自动继续运行的). 因为脚本会在后台运行, 没有人会一直点击确定, 所以该脚本会保持挂起的状态直到你结束这个脚本的进程.

个人补充: 还有就是在执行一些轮询脚本时, 会有上千甚至上万个输出, 谁也不想一个个去点击OK, 这时候使用CScript是非常明知的.

记事本和脚本编辑器

终于要开始编写你自己的脚本了, 在脚本道路上基本都是从记事本开始. 记事本是免费的, 易于使用. 但是你可能会意识到记事本会使你的编写变的十分困难, 是否有一些专门的工具和编辑器来供大家选择呢?

基本: 记事本

这个大概大家都不陌生, 一个基本的Windows自带的文本编辑器. 然而这又是一个差强人意的脚本编辑器. 它的最大问题在于无法显式的看见行号, VBS脚本通常会报出”Go to line number”的错误提示, 虽然你可以通过记事本的跳转行号功能来找到这一行, 或者使用状态栏的显示功能来找到, 但是这看起来并不是让人满意的.

记事本还缺少关键字高亮, 颜色标记等功能……当编写很长的脚本时会感到很头疼.

clip_p_w_picpath011图9

加强: Programmer’s File Editor

Programmer’s File Editor, 也叫PFE, 是一个加强的记事本.

clip_p_w_picpath013 图10

实际上这仅仅是一个记事本的加强版, 在行号, 高亮, 函数颜色标记等发面还是不尽如人意的, 这里提到仅仅是因为微软的脚本专家推荐过而已.

专业: VBScript Editors (仅为微软脚本专家的推荐, 其实我个人是用别的编辑器的)

脚本专家们推荐了3个工具:

1. VbsEdit (www.adersoft.com)

2. Creamsoft (www.creamsoft.com)

3. PrimalScript (www.sapien.com/products.htm)

这些工具都是收费的软件, 理所当然的有好多高级功能, 对于调试等工作还是很方便的. 这些工具也可以对ASP, HTML, PHP, JSP等进行操作.

我个人比较喜欢使用SciTE, 大家也可以根据个人喜好找到顺手的编辑器, 没有最好只有用的是否习惯.

编写你的第一个脚本

我并不想大家一开始就花钱在学习脚本上, 这里我们假定使用的编辑器为记事本.

为了这第一个脚本, 我选择了一个可以告诉你是哪个用户或者哪些用户打开执行的示例脚本.

‘ first, get the server name we want to work with

varServer = InputBox (“Server name to check”)

‘ get the local path of the file to check

varFile= InputBox _

(“Full path and filename of the file on the ” & _

“server (use the local path as if you were at the ” & _

” server console)”)

‘ bind to the server’s file service

set objFS = GetObject(“WinNT://” & varServer & “/lamanserver,fileservice”)

‘ scan through the open resources until welocate the file we want

varFoundNone = True

‘ use a FOR…EACH loop to walk through the open resources

For Each objRes in objFS.Resources

‘ does this resource match the one we’re looking for?

If objRes.Path = varFile then

‘ we found the file – show who’s got it

varFoundNone = False

WScript.Echo objRes.Path & ” is opened by ” & objRes.User

End If

Next

‘ if we didn’t find the file open, display a msg

if varFoundNone = True then

WScript.Echo “Didn’t find that file opened by anyone.”

end if

执行你的第一个脚本

将脚本命名为WhoHas.vbs后双击使用WScript执行. 首先会提示你输入需要连接到的服务器,如图12, 一定要确保当前用户可以访问该服务器(脚本运行默认为当前用户凭据来访问服务器), 并且拥有管理权限. 然后输入完整的路径和文件名来检查都有哪些用户打开了该文件.

例如, 假设一个服务器上有D:\Shares\Sales, 共享名为Sales. 一个用户访问该目录下的SalesGoals.docx(即为使用\\servername\Sales\SalesGoals.docx这样的UNC路径访问),如图11, 你现在想知道是哪个用户或者哪些用户访问的这个文件. 你应当输入D:\Shares\Sales\SalesGoals.docx, 此处为服务器上的本地路径, 如图13.

当你单击确定, 郁闷的事情发生了. 提示在第11行上有错误, 如图14! 看来我们需要调试这个脚本了.

clip_p_w_picpath015 图11

clip_p_w_picpath016 图12

clip_p_w_picpath017 图13

clip_p_w_picpath019 图14

为第一个脚本调试和排错

打开并找到11行, Oh my god! 居然是单词拼写这样的无语错误(往往最难排除的就是这样的最低级错误, 所以需要特别注意). 原来是把lanmanserver写成了lamanserver, 如图15. 改正后运行结果就变的正常了, 如图16,这和图11中的结果是一致的.

clip_p_w_picpath021 图15

clip_p_w_picpath022 图16

实际上排错并没有这么简单, 这里只是给大家简单演示一下. 通常情况下我们可能需要借助工具来排错, 例如使用Microsoft Script Debugger(www.Microsoft.com/scripting). 具体的一些操作可以参阅帮助文档, 如果有必要我也会单独发布排错的文章.

总结

VBScript执行起来是很容易的, 因为默认情况下WScript.exe已经与每个Windows脚本相关联. 在一些需要后台执行或者轮询处理的时候另一个WSH, CScript, 是非常重要的.

脚本编写可能是一个比较棘手的问题, 因为Windows并没有提供内置的专门工具, 当然记事本是可以完成绝大部分的编写工作的, 但是这并不是一个令人满意的编辑器. 毕竟脚本并没有像软件开发项目这样有着众多的复杂要求, 因此也并不必强求大家来购买收费软件.

接下来

现在你就可以创建和编写你的脚本了, 你可以自己更多的学习和实践了. 第三章将讲解脚本的各个组成部分, 并介绍一些示例脚本. 第四章我们就要开始真正设计脚本了.