WSF脚本详解:JS和VBS互调用
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">C:\Users\nutix\Desktop\Persons.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>
执行“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:"John Smith" /sex:Male /age:32 "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:"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()方法的结果。
可见,如果一个WSF脚本中包含多个<job>,而在调用时没有指定调用哪个job,就默认会执行第一个job的所有<script>块的代码。如果想调用第二个job,可以执行cscript //nologo //job:vbs Test.wsf,其结果如下:
1 C:\Users\nutix\Desktop\test.wsf(68, 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:是否以批处理模式执行
6.使用WSF替代VBS/JS的理由:
【1】可联合使用VBS/JS的标准库
【2】可更友好的支持命令行:可提供充足详实的命令行文档及调用控制
【3】可方便地导入现有的代码模块
【4】可更方便地对功能进行集成:借助<Job>元素
【5】支持直接向网页的移植
【6】更便利的跨语言的全局对象,只要不同语言的<Script>块处于同一个<Job>块中,这个块中的全局变量是跨语言公用的
转载于:https://www.cnblogs.com/vitrox/p/5137441.html
WSF脚本详解:JS和VBS互调用相关推荐
- socket服务器断开消息,详解JS WebSocket断开原因和心跳机制
1.断开原因 WebSocket断开的原因有很多,最好在WebSocket断开时,将错误打印出来. ws.onclose = function (e) { console.log('websocket ...
- 非常运维 一体化终端安全管理系统自动安装脚本详解
非常运维 一体化终端安全管理系统自动安装脚本详解 作者:高玉涵 时间:2019.03.13 13:52 博客:blog.csdn.net/cg_i 演示:https://v.youku.com/v ...
- linux 弹出窗口,实现弹出窗口的window.open用法详解(js代码)
实现弹出窗口的window.open用法详解(js代码) [1.最基本的弹出窗口代码] 其实代码非常简单: 因为这是一段javascripts代码,所以它们应该放在 cript">标签 ...
- sshd系统自带启动脚本详解
SSH 为 Secure Shell 的缩写.sshd服务是linux系统中最经常使用的服务之一.由于其规避了明文传送口令.内容本文及中间人***的安全隐患,因此经常作为远程管理系统的首选方案.虽然各 ...
- shell脚本详解(十二)——Here Document免交互及Expect自动化交互
shell脚本详解(十二)--Here Document免交互及Expect自动化交互 一.Here Document 免交互 1.格式 2.注意事项 3.免交互方式实现对行数的统计,将要统计的内容置 ...
- shell脚本详解(十)——sed编辑器的使用方法
shell脚本详解(十)--sed编辑器的使用方法 一.sed编辑器 二.sed编辑器工作流程 1.读取: 2.执行: 3.显示: 4.注: 三.命令格式 四.常用选项 五.常用操作 六.使用地址 s ...
- shell脚本详解(九)——一键部署DNS正向解析
shell脚本详解(九)--一键部署DNS正向解析 一.DNS正向解析 二.shell脚本一键部署 一.DNS正向解析 详情请点击:DNS正向解析 二.shell脚本一键部署 #!/bin/bash ...
- shell脚本详解(七)——正则表达式、sort、uniq、tr
shell脚本详解(七)--正则表达式.sort.uniq.tr 一.排序命令--sort 1.格式 2.常用选项 3.示例 二.去除重复行操作命令--uniq 1.格式 2.常用选项 3.示例 三. ...
- shell脚本详解(六)——数组简介和排序算法
shell脚本详解(六)--数组简介和排序算法 一.数组 1.数组的定义方法 ①.方式一: ②.方式二: ③.方式三: ④.方式四: 2.数组包括的数据类型 3.获取数组长度 4.获取数据列表 5.读 ...
最新文章
- 学python去哪做项目_有哪些适合 Python 刚入门者去做的项目?
- cve-2019-11076 Cribl UI 1.5.0 未授权命令执行漏洞分析
- python编程视频-Python开发视频百度就得看这个!
- 一句话搞定python六剑客
- MySQL与会计报表_会计报表的18项必须审核的数据
- 移动后端支持平台Parse将API由Ruby迁移到Go
- 4乘4方格走的路线_苏州周边4个冷门自驾游路线景点推荐
- 揭秘阿里中台!一文看懂阿里推荐业务的两项利器 | 赠书
- java list foreach 修改_Java ArrayList在foreach中remove的问题分析
- java直_java直连数据库小结
- CCS 报警告 #10247-D
- 情境认知测量方法的研究
- 怎样锁定计算机本地磁盘,win7系统本地磁盘加密的操作方法
- GameEntity(四)—— Ientity
- linux su无效_linux系统 su切换用户失败情况
- 粒子的散射模拟matlab程序,基于Matlab的α粒子的散射实验模拟.pdf
- 安卓SSL证书格式:pfx转换BKS格式证书
- Windows10鼠标右键增加新项
- 白魔法师(牛客小白月赛25 图、并查集)
- 数量乘以单价的公式计算机,“excel公式大全详解“单价乘以数量 然后累加的公式 EXCEL...