WSF脚本详解:JS和VBS互调用
1.概述
Windows Script Host除了提供一個對象模型之外,還提供了一種腳本框架,這就是WSF腳本。通過WSF約定的標(biāo)記元素,可以將多種腳本語言寫的代碼塊組合起來,完成任務(wù)。除此之外,還可以實現(xiàn)一些DOS沒有的命令功能,通過CScript xxx.wsf /?來查看幫助文檔,幫助文檔由WSF聲明并由解釋器動態(tài)生成完整的文檔。再聯(lián)合使用WshEnvironment對象,即可對DOS命令,隨心所欲的提供增量功能實現(xiàn)了。
2.WSF標(biāo)記
| 元素 | 語法 | 屬性 | 備注 |
| <?job?> | <?job error="flag" debug="flag" ?> |
error=>布爾值;默認(rèn)值false;當(dāng)error="true"時,就允許 Windows腳本(.wsf)文件中存在語法錯誤或運行時錯誤。 |
父元素<job> |
| <?XML?> |
<?XML version="version" [standalone="DTDflag"] ?> |
version=>n.n形式,指定文件的XML級別。默認(rèn)值1.0。 DTDflag=>可選,布爾值;指明 XML 文件中是否包括對外部文檔類型定義 (DTD) 的引用。腳本組件 XML 文件不包括這樣的引用,因此該屬性值始終是 "yes"。 |
可選,須放于第一行。通過不用,否則,腳本中的大于號和小于號,將被錯誤處理 |
| <description> | <description>text</description> | text=>文本【可多行】,用于描述腳本用途,即用法文檔的第一行 | 父元素<runtime> |
| <example> | <example>text</example> | text=>文本,用于提供簡單的腳本調(diào)用示例 | 父元素<runtime> |
| <job> | <job [id=JobID]>code</job> |
JobID=>作業(yè)id,須是合法標(biāo)識符,且在當(dāng)前程序中惟一 | 只有一作業(yè)的wsf腳本,無需父元素<package>,可以很多個 |
| <named> | <named name = namedname helpstring = helpstring type = "string|boolean|simple" required = boolean/> |
name=>字符串;參數(shù)名,將傳入Wscript.Arguments.Named中 helpstring=>文本;此參數(shù)的說明文檔。WSH運行時使用ShowUsage()或 /? 來獲取這里定義的參數(shù)文檔。 type=>可選。限定參數(shù)的類型,參數(shù)的類型定義如何從命令行分析參數(shù)。默認(rèn)值為simple;string即字符串,boolean用+/-表示true/false;simple時,沒有value,如"dir |
父元素<runtime>,可以很多個 |
| <object> |
<object id="objID" [classid="clsid:GUID" | progid="progID"] /> |
objID=>合法惟一的標(biāo)識符。用于引用腳本中該對象的名稱。 GUID=>可選。對象的類 ID (GUID)。 progID=>可選。對象的程序 ID,可指定它來替換類 ID。 |
父元素<job>,如<obect id="fso" progid="Scripting.FileSystemObject"/>,腳本中就可直接使用fso,而不用再聲明此對象;可以是很多個 |
| <package> | <package>jobs</package> | jobs=>一個或多個<job>元素 | 當(dāng)有多個作業(yè)(Job)時,必須使用 |
| <reference> |
<reference [progid="progID"|guid="typelibGUID"] [version="version"] /> |
progID=> 可以派生出類型庫的程序ID。它可以包含一個版本號(例如,ADO.Recordset.2.0),即類型庫的顯式程序 ID,也可以包含與類型庫合并的可執(zhí)行文件(如 .DLL)的程序 ID。如果使用對象屬性,就無需指定版本屬性,因為可從程序 ID 中推斷版本。如果指定了對象屬性,就不能同時指定 GUID 屬性。 typelibGUID=>要引用的類型庫的 GUID。如果指定了 GUID 屬性,就不能指定對象屬性。 version=>可選。要使用的類型庫的版本號。它的形式必須為 <主要版本>[.<次要版本>]。如果未指定版本,則默認(rèn)版本為 1.0。如果對象屬性用于指定類型庫,且未指定版本,則版本會從指定程序 ID 的注冊表項中派生。如果未找到任何信息,則默認(rèn)版本為 1.0。 |
父元素<job>,可以有很多個,一個job的引用,在另一個job的代碼中不可見 |
| <resource> | <resource id="resourceID">textornumber</resource> |
resourceID=>腳本中資源的唯一標(biāo)識符,內(nèi)容是文本或數(shù)字 | 可以有很多個,父元素<job>,一個job的資源,在另一個job的代碼中不可見 |
| <runtime> | <runtime> <description>text<description> <named attributes etc. /> <unnamed attributes etc. /> <example>text</example> </runtime> |
ShowUsage()使用由 <runtime> 元素括起來的信息,以便顯示腳本的運行時參數(shù)。父元素<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=>用于在用法中表示該參數(shù)的字符串。該值不用在別處。 Helpstring=>此參數(shù)的說明文檔。WSH運行時使用ShowUsage()或 /? 獲取參數(shù)文檔 many=>可選,布爾值。如果為true,則該參數(shù)重復(fù)的次數(shù)可以比由required屬性指定的次數(shù)多;否則,required屬性正好表示要使用所需參數(shù)的次數(shù)。 |
當(dāng)設(shè)置“必需”屬性時,布爾值將被轉(zhuǎn)換成整數(shù);"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根據(jù)<runtime>元素中其它元素動態(tài)生成的文檔 | 父元素<runtime> |
3.自定義命令行工具示例
1 <package>
2 <job id="js">
3 <resource id="dbpath">C:Users
utixDesktopPersons.xml</resource>
4 <object id="fso" progid="Scripting.FileSystemObject" />
5 <object id="xml" progid="MSXML2.DomDocument" />
6 <object id="ws" progid="WScript.Shell" />
7 <runtime>
8 <description>Write the base information of a person to the database</description>
9 <named name="name" helpstring="name of person." type="string" required="true" />
10 <named name="sex" helpstring="sex of person." type="string" required="true" />
11 <named name="age" helpstring="age of person." type="string" required="true" />
12 <unnamed name="note" helpstring="note of person" many="false" required="false" />
13 <example>Test.wsf /name:"John Smith" /sex:Male /age:32 "Got some trouble!"</example>
14 </runtime>
15 <script language="JScript">
16 var argsNamed = WScript.Arguments.Named;
17 var argsUnnamed = WScript.Arguments.Unnamed;
18 WScript.Echo("There are " + argsNamed.length + " named arguments:");
19 for(var e=new Enumerator(argsNamed);!e.atEnd();e.moveNext()){
20 var name=e.item();
21 WScript.Echo("['"+name+"']="+argsNamed.Item(name));
22 }
23 WScript.Echo("There are " + argsUnnamed.length + " unnamed arguments:");
24 for(var i=0;i<argsUnnamed.length;i++){
25 WScript.Echo('['+i.toString()+']:'+argsUnnamed.Item(i));
26 }
27 WScript.Echo("There are " + WScript.Arguments.length + " arguments in total:");
28 for(var e=new Enumerator(WScript.Arguments);!e.atEnd();e.moveNext()){
29 WScript.Echo(e.item());
30 }
31 WScript.Arguments.ShowUsage();
32 //==============================================================
33 var argsNeeded=new Array('name','sex','age');
34 for(var i=0;i<argsNeeded.length;i++)
35 if(!argsNamed.Exists(argsNeeded[i])){
36 WScript.Echo('Error: Full information is needed, like name, sex, age.');
37 WScript.Quit();
38 }
39 dbpath=getResource('dbpath');
40 if(!fso.FileExists(dbpath)){
41 xml.loadXML('<?xml version="1.0" encoding="utf-8"?><Persons />');
42 xml.save(dbpath);
43 }
44 //--------------------------------------------------------------
45 xml.load(dbpath);
46 var doc=xml.documentElement
47 var person=xml.createElement('Person');
48 var nameAttr=xml.createAttribute('name');
49 nameAttr.text=argsNamed.Item('name');
50 person.setAttributeNode(nameAttr);
51 var sexAttr=xml.createAttribute('sex');
52 sexAttr.text=argsNamed.Item('sex');
53 person.setAttributeNode(sexAttr);
54 var ageAttr=xml.createAttribute('age');
55 ageAttr.text=argsNamed.Item('age');
56 person.setAttributeNode(ageAttr);
57 if(argsUnnamed.length!=0&&argsUnnamed.Item(0)!='')
58 person.text=argsUnnamed.Item(0);
59 doc.appendChild(person);
60 xml.save(dbpath);
61 //--------------------------------------------------------------
62 ws.Run('Notepad.exe "'+dbpath+'"');
63 </script>
64 </job>
65 <job id="vbs">
66 <script language="VBScript">
67 WScript.Echo getResource("dbpath")
68 </script>
69 </job>
70 </package>
執(zhí)行“Test.wsf /?”的結(jié)果如下:
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:"John Smith" /sex:Male /age:32 "Got some trouble!"
第1行,最前一行直接顯示<description>的內(nèi)容
第2行,由WScript.exe或CScript.exe根據(jù)<runtime>元素的各個子元素提供的信息,動態(tài)生成的調(diào)用方式
第6-9行,是由WScript.exe或CScript.exe根據(jù)<runtime>元素的各個<named>/<unnamed>元素提供的信息,生成的參數(shù)說明,即<參數(shù)名>:<description>
第10行,最后一行直接顯示的是<example>元素的內(nèi)容。
因為note參數(shù)required="false",所以它不是必須的,所以上面的文檔中顯示的是"[note]"而不是"note"
在命令窗口中執(zhí)行以下的命令:
cscript //nologo Test.wsf /name:"John Smith" /sex:Male /age:32 "Got some trouble!"
輸出:
1 There are 3 named arguments: 2 ['name']=John smith 3 ['sex']=Male 4 ['age']=32 5 There are 1 unnamed arguments: 6 [0]:Got some trouble! 7 There are 4 arguments in total: 8 /name:John smith 9 /sex:Male 10 /age:32 11 Got some trouble! 12 Write the base information of a person to the database 13 用法: Test.wsf /name:value /sex:value /age:value [note] 14 15 選項: 16 17 name : name of person. 18 sex : sex of person. 19 age : age of person. 20 note : note of person 21 Test.wsf /name:"John Smith" /sex:Male /age:32 "Got some trouble!"
第12-21行,是WScript.ShowUsage()方法的結(jié)果。
可見,如果一個WSF腳本中包含多個<job>,而在調(diào)用時沒有指定調(diào)用哪個job,就默認(rèn)會執(zhí)行第一個job的所有<script>塊的代碼。如果想調(diào)用第二個job,可以執(zhí)行cscript //nologo //job:vbs Test.wsf,其結(jié)果如下:
1 C:Users utixDesktop est.wsf(68, 14) Microsoft VBScript 運行時錯誤: 無效的過程調(diào)用或參 數(shù): '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 '獲得驅(qū)動器 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】直接將不同語言的代碼寫進(jìn)同一個WSF腳本文件中,這只需要使用多種語言的<script>塊就行了。
5.WSH文件,這是一種簡單的配置文件,它的作用和腳本文件右鍵》屬性》腳本選項卡的內(nèi)容一樣,可設(shè)置項很少很簡單,下面是一個例子:
1 [ScriptFile] 2 Path=C:Users utixDesktopa.js 3 [Options] 4 Timeout=0 5 DisplayLogo=1 6 BatchMode=0
注意:Path指定的腳本文件必須存在,且可以被WScript或CScript解釋執(zhí)行。其它設(shè)置項:Timeout:設(shè)置超時時間,超時時自動終止執(zhí)行,DisplayLogo:是否顯示徽標(biāo),BatchMode:是否以批處理模式執(zhí)行
6.使用WSF替代VBS/JS的理由:
【1】可聯(lián)合使用VBS/JS的標(biāo)準(zhǔn)庫
【2】可更友好的支持命令行:可提供充足詳實的命令行文檔及調(diào)用控制
【3】可方便地導(dǎo)入現(xiàn)有的代碼模塊
【4】可更方便地對功能進(jìn)行集成:借助<Job>元素
【5】支持直接向網(wǎng)頁的移植
【6】更便利的跨語言的全局對象,只要不同語言的<Script>塊處于同一個<Job>塊中,這個塊中的全局變量是跨語言公用的
總結(jié)
以上是生活随笔為你收集整理的WSF脚本详解:JS和VBS互调用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html页面设置<span>
- 下一篇: 第三方图标库学习(一)iconfont