码迷,mamicode.com
首页 > Web开发 > 详细

WSF脚本详解:组合JS和VBS代码完成作业

时间:2016-01-17 18:57:41      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:

1.概述

  Windows Script Host除了提供一个对象模型之外,还提供了一种脚本框架,这就是WSF脚本。通过WSF约定的标记元素,可以将多种脚本语言写的代码块组合起来,完成任务。除此之外,还可以实现一些DOS没有的命令功能,通过CScript xxx.wsf /?来查看帮助文档,帮助文档由WSF声明并由解释器动态生成完整的文档。再联合使用WshEnvironment对象,即可对DOS命令,随心所欲的提供增量功能实现了。

2.WSF标记

元素 语法 属性 备注
<?job?>
<?job error="flag" debug="flag" ?>
error=>布尔值;默认值false;当error="true"时,就允许 Windows脚本(.wsf)文件中存在语法错误或运行时错误。
Debug=>布尔值;默认值false;当debug="true"时,就启用调试,出错时,将启动脚本调试程序。
父元素<job>
<?XML?>
<?XML version="version" [standalone="DTDflag"] ?> 
version=>n.n形式,指定文件的XML级别。默认值1.0。
DTDflag=>可选,布尔值;指明 XML 文件中是否包括对外部文档类型定义 (DTD) 的引用。脚本组件 XML 文件不包括这样的引用,因此该属性值始终是 "yes"。 
可选,须放于第一行。通过不用,否则,脚本中的大于号和小于号,将被错误处理
<description> <description>text</description> text=>文本【可多行】,用于描述脚本用途,即用法文档的第一行 父元素<runtime>
<example> <example>text</example> text=>文本,用于提供简单的脚本调用示例 父元素<runtime>
<job> <job [id=JobID]>code</job>  JobID=>作业id,须是合法标识符,且在当前程序中惟一 只有一作业的wsf脚本,无需父元素<package>,可以很多个
<named> <named name = namedname helpstring = helpstring
  type = "string|boolean|simple"   required = boolean/>
name=>字符串;参数名,将传入Wscript.Arguments.Named中
helpstring=>文本;此参数的说明文档。WSH运行时使用ShowUsage()或 /? 来获取这里定义的参数文档。
type=>可选。限定参数的类型,参数的类型定义如何从命令行分析参数。默认值为simple;string即字符串,boolean用+/-表示true/false;simple时,没有value,如"dir /b"这个"b"命名参数,就是无值的
required=>可选,布尔值;指明某个参数是否必需的。
父元素<runtime>,可以很多个
<object>
<object id="objID" [classid="clsid:GUID" | progid="progID"] />
objID=>合法惟一的标识符。用于引用脚本中该对象的名称。
GUID=>可选。对象的类 ID (GUID)。
progID=>可选。对象的程序 ID,可指定它来替换类 ID。
父元素<job>,如<obect id="fso" progid="Scripting.FileSystemObject"/>,脚本中就可直接使用fso,而不用再声明此对象;可以是很多个
<package> <package>jobs</package>  jobs=>一个或多个<job>元素 当有多个作业(Job)时,必须使用
<reference>
<reference [progid="progID"|guid="typelibGUID"] [version="version"] />
progID=>
可以派生出类型库的程序ID。它可以包含一个版本号(例如,ADO.Recordset.2.0),即类型库的显式程序 ID,也可以包含与类型库合并的可执行文件(如 .DLL)的程序 ID。如果使用对象属性,就无需指定版本属性,因为可从程序 ID 中推断版本。如果指定了对象属性,就不能同时指定 GUID 属性。
typelibGUID=>要引用的类型库的 GUID。如果指定了 GUID 属性,就不能指定对象属性。
version=>可选。要使用的类型库的版本号。它的形式必须为 <主要版本>[.<次要版本>]。如果未指定版本,则默认版本为 1.0。如果对象属性用于指定类型库,且未指定版本,则版本会从指定程序 ID 的注册表项中派生。如果未找到任何信息,则默认版本为 1.0。 
父元素<job>,可以有很多个,一个job的引用,在另一个job的代码中不可见
<resource> <resource id="resourceID">textornumber</resource> resourceID=>脚本中资源的唯一标识符,内容是文本或数字 可以有很多个,父元素<job>,一个job的资源,在另一个job的代码中不可见
<runtime> <runtime>
   <description>text<description>
   <named attributes etc. />
   <unnamed attributes etc. />
   <example>text</example>
</runtime>
  ShowUsage()使用由 <runtime> 元素括起来的信息,以便显示脚本的运行时参数。父元素<job>
<script> <script language="language" [src="strFile"]>code</script>  language=>声明用于脚本块中的脚本语言名称,如 VBScript 或 JavaScript。
strFile=>要包括在脚本块中的脚本文件名,如c:\\a.js
父元素<job>,可以有很多个,语言不必相同
<unnamed> <unnamed name = unnamedname
helpstring = helpstring
 many = boolean required = boolean/ integer/>
name=>用于在用法中表示该参数的字符串。该值不用在别处。
Helpstring=>此参数的说明文档。WSH运行时使用ShowUsage()或 /? 获取参数文档
many=>可选,布尔值。如果为true,则该参数重复的次数可以比由required属性指定的次数多;否则,required属性正好表示要使用所需参数的次数。
Required=>可选。指明该参数在命令行中出现次数的整数值。 
当设置“必需”属性时,布尔值将被转换成整数;"true" 变成 1,而 "false" 变成 0。可以有很多个。比如<unnamed name="filename" helpstring="..." many="false" required="true" />生成文档example.wsf filename;比如<unnamed name="filename" helpstring="..." many="false" required="3" />生成文档example.wsf filename1 filename2 filename3
<usage> <usage>text</usage> text=>用于替代WSH根据<runtime>元素中其它元素动态生成的文档 父元素<runtime>

3.自定义命令行工具示例

 1 <package>
 2     <job id="js">
 3         <resource id="dbpath">D:\Data\Persons.xml</resource>
 4         <runtime>
 5             <description>Write the base information of a person to the database</description>
 6             <named name="name" helpstring="name of person." type="string" required="true" />
 7             <named name="sex" helpstring="sex of person." type="string" required="true" />
 8             <named name="age" helpstring="age of person." type="string" required="true" />
 9             <unnamed name="note" helpstring="note of person" many="false" required="false" />
10             <example>Test.wsf /name:lilei /sex:male /age:34 "Got some trouble!"</example>
11         </runtime>
12         <script language="JScript">
13             var argsNamed = WScript.Arguments.Named;
14             var argsUnnamed = WScript.Arguments.Unnamed;
15             WScript.Echo("There are " + argsNamed.length + " named arguments:");
16             for(var e=new Enumerator(argsNamed);!e.atEnd();e.moveNext()){
17                 var name=e.item();
18                 WScript.Echo("[‘"+name+"‘]="+argsNamed.Item(name));
19             }
20             WScript.Echo("There are " + argsUnnamed.length + " unnamed arguments:");
21             for(var i=0;i<argsUnnamed.length;i++){
22                 WScript.Echo(‘[‘+i.toString()+‘]:‘+argsUnnamed.Item(i));
23             }
24             WScript.Echo("There are " + WScript.Arguments.length + " arguments in total:");
25             for(var e=new Enumerator(WScript.Arguments);!e.atEnd();e.moveNext()){
26                 WScript.Echo(e.item());
27             }
28             WScript.Echo(getResource(‘dbpath‘));
29         </script>
30     </job>
31     <job id="vbs">
32         <script language="VBScript">
33             WScript.Echo getResource("dbpath")
34         </script>
35     </job>
36 </package>

执行“Test.wsf /?”的结果如下:

 1 Write the base information of a person to the database
 2 用法: Test.wsf /name:value /sex:value /age:value [note]
 3 
 4 选项:
 5 
 6 name : name of person.
 7 sex  : sex of person.
 8 age  : age of person.
 9 note : note of person
10 Test.wsf /name:lilei /sex:male /age:34 "Got some trouble!"

第1行,最前一行直接显示<description>的内容

第2行,由WScript.exe或CScript.exe根据<runtime>元素的各个子元素提供的信息,动态生成的调用方式

第6-9行,是由WScript.exe或CScript.exe根据<runtime>元素的各个<named>/<unnamed>元素提供的信息,生成的参数说明,即<参数名>:<description>

第10行,最后一行直接显示的是<example>元素的内容。

因为note参数required="false",所以它不是必须的,所以上面的文档中显示的是"[note]"而不是"note"

在命令窗口中执行以下的命令:

cscript //nologo Test.wsf /name:lilei /sex:male /age:34 "Got some trouble!"

输出:

 1 There are 3 named arguments:
 2 [‘name‘]=lilei
 3 [‘sex‘]=male
 4 [‘age‘]=34
 5 There are 1 unnamed arguments:
 6 [0]:Got some trouble!
 7 There are 4 arguments in total:
 8 /name:lilei
 9 /sex:male
10 /age:34
11 Got some trouble!
12 D:\Data\Persons.xml

可见,如果一个WSF脚本中包含多个<job>,而在调用时没有指定调用哪个job,就默认会执行第一个job的所有<script>块的代码。如果想调用第二个job,可以执行cscript //nologo //job:vbs Test.wsf,其结果如下:

1 C:\Users\nutix\Desktop\test.wsf(33, 14) Microsoft VBScript 运行时错误: 无效的过程调用或参 数: ‘getResource‘

显然这里无法访问//Job:js中的resource

4.组合不同语言的代码

【1】通过<script>块的src引用外部代码

 1 <package>
 2 <job id="IncludeExample">
 3     <script language="JScript" src="GetFreeSpace.JS"/>
 4     <script language="VBScript">
 5         获得驱动器 C 的可用空间。
 6         s = GetFreeSpace("c:")
 7         WScript.Echo s
 8     </script>
 9 </job>
10 </package>

GetFreeSpace.js的代码:

1 function GetFreeSpace(drvPath) {
2    var fs, d, s;
3    fs = new ActiveXObject("Scripting.FileSystemObject");
4    d = fs.GetDrive(fs.GetDriveName(drvPath));
5    s = "Drive " + drvPath + " - " ;
6    s += d.VolumeName;
7    s += " Free Space: " + d.FreeSpace/1024 + " Kbytes";
8    return s;
9 } 

【2】直接将不同语言的代码写进同一个WSF脚本文件中,这只需要使用多种语言的<script>块就行了。

5.WSH文件,这是一种简单的配置文件,它的作用和脚本文件右键》属性》脚本选项卡的内容一样,可设置项很少很简单,下面是一个例子:

1 [ScriptFile]
2 Path=C:\Users\nutix\Desktop\a.js
3 [Options]
4 Timeout=0
5 DisplayLogo=1
6 BatchMode=0

注意:Path指定的脚本文件必须存在,且可以被WScript或CScript解释执行。其它设置项:Timeout:设置超时时间,超时时自动终止执行,DisplayLogo:是否显示徽标,BatchMode:是否以批处理模式执行

 

WSF脚本详解:组合JS和VBS代码完成作业

标签:

原文地址:http://www.cnblogs.com/vitrox/p/5137441.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!