日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

WSF脚本详解:JS和VBS互调用

發(fā)布時(shí)間:2024/1/1 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WSF脚本详解:JS和VBS互调用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.概述

  Windows Script Host除了提供一個(gè)對(duì)象模型之外,還提供了一種腳本框架,這就是WSF腳本。通過(guò)WSF約定的標(biāo)記元素,可以將多種腳本語(yǔ)言寫的代碼塊組合起來(lái),完成任務(wù)。除此之外,還可以實(shí)現(xiàn)一些DOS沒(méi)有的命令功能,通過(guò)CScript xxx.wsf /?來(lái)查看幫助文檔,幫助文檔由WSF聲明并由解釋器動(dòng)態(tài)生成完整的文檔。再聯(lián)合使用WshEnvironment對(duì)象,即可對(duì)DOS命令,隨心所欲的提供增量功能實(shí)現(xiàn)了。

2.WSF標(biāo)記

元素語(yǔ)法屬性備注
<?job?> <?job error="flag" debug="flag" ?> error=>布爾值;默認(rèn)值false;當(dāng)error="true"時(shí),就允許 Windows腳本(.wsf)文件中存在語(yǔ)法錯(cuò)誤或運(yùn)行時(shí)錯(cuò)誤。
Debug=>布爾值;默認(rèn)值false;當(dāng)debug="true"時(shí),就啟用調(diào)試,出錯(cuò)時(shí),將啟動(dòng)腳本調(diào)試程序。
父元素<job>
<?XML?> <?XML version="version" [standalone="DTDflag"] ?>? version=>n.n形式,指定文件的XML級(jí)別。默認(rèn)值1.0。
DTDflag=>可選,布爾值;指明 XML 文件中是否包括對(duì)外部文檔類型定義 (DTD) 的引用。腳本組件 XML 文件不包括這樣的引用,因此該屬性值始終是 "yes"。?
可選,須放于第一行。通過(guò)不用,否則,腳本中的大于號(hào)和小于號(hào),將被錯(cuò)誤處理
<description><description>text</description>text=>文本【可多行】,用于描述腳本用途,即用法文檔的第一行父元素<runtime>
<example><example>text</example>text=>文本,用于提供簡(jiǎn)單的腳本調(diào)用示例 父元素<runtime>
<job><job [id=JobID]>code</job>?JobID=>作業(yè)id,須是合法標(biāo)識(shí)符,且在當(dāng)前程序中惟一只有一作業(yè)的wsf腳本,無(wú)需父元素<package>,可以很多個(gè)
<named><named name = namedname helpstring = helpstring
? type = "string|boolean|simple"?? required = boolean/>
name=>字符串;參數(shù)名,將傳入Wscript.Arguments.Named中
helpstring=>文本;此參數(shù)的說(shuō)明文檔。WSH運(yùn)行時(shí)使用ShowUsage()或 /? 來(lái)獲取這里定義的參數(shù)文檔。
type=>可選。限定參數(shù)的類型,參數(shù)的類型定義如何從命令行分析參數(shù)。默認(rèn)值為simple;string即字符串,boolean用+/-表示true/false;simple時(shí),沒(méi)有value,如"dir /b"這個(gè)"b"命名參數(shù),就是無(wú)值的
required=>可選,布爾值;指明某個(gè)參數(shù)是否必需的。
父元素<runtime>,可以很多個(gè)
<object> <object id="objID" [classid="clsid:GUID" | progid="progID"] /> objID=>合法惟一的標(biāo)識(shí)符。用于引用腳本中該對(duì)象的名稱。
GUID=>可選。對(duì)象的類 ID (GUID)。
progID=>可選。對(duì)象的程序 ID,可指定它來(lái)替換類 ID。
父元素<job>,如<obect id="fso" progid="Scripting.FileSystemObject"/>,腳本中就可直接使用fso,而不用再聲明此對(duì)象;可以是很多個(gè)
<package><package>jobs</package>?jobs=>一個(gè)或多個(gè)<job>元素當(dāng)有多個(gè)作業(yè)(Job)時(shí),必須使用
<reference> <reference [progid="progID"|guid="typelibGUID"] [version="version"] /> progID=>
可以派生出類型庫(kù)的程序ID。它可以包含一個(gè)版本號(hào)(例如,ADO.Recordset.2.0),即類型庫(kù)的顯式程序 ID,也可以包含與類型庫(kù)合并的可執(zhí)行文件(如 .DLL)的程序 ID。如果使用對(duì)象屬性,就無(wú)需指定版本屬性,因?yàn)榭蓮某绦?ID 中推斷版本。如果指定了對(duì)象屬性,就不能同時(shí)指定 GUID 屬性。
typelibGUID=>要引用的類型庫(kù)的 GUID。如果指定了 GUID 屬性,就不能指定對(duì)象屬性。
version=>可選。要使用的類型庫(kù)的版本號(hào)。它的形式必須為 <主要版本>[.<次要版本>]。如果未指定版本,則默認(rèn)版本為 1.0。如果對(duì)象屬性用于指定類型庫(kù),且未指定版本,則版本會(huì)從指定程序 ID 的注冊(cè)表項(xiàng)中派生。如果未找到任何信息,則默認(rèn)版本為 1.0。?
父元素<job>,可以有很多個(gè),一個(gè)job的引用,在另一個(gè)job的代碼中不可見(jiàn)
<resource><resource id="resourceID">textornumber</resource>resourceID=>腳本中資源的唯一標(biāo)識(shí)符,內(nèi)容是文本或數(shù)字可以有很多個(gè),父元素<job>,一個(gè)job的資源,在另一個(gè)job的代碼中不可見(jiàn)
<runtime><runtime>
?? <description>text<description>
?? <named attributes etc. />
?? <unnamed attributes etc. />
?? <example>text</example>
</runtime>
?ShowUsage()使用由 <runtime> 元素括起來(lái)的信息,以便顯示腳本的運(yùn)行時(shí)參數(shù)。父元素<job>
<script><script language="language" [src="strFile"]>code</script>?language=>聲明用于腳本塊中的腳本語(yǔ)言名稱,如 VBScript 或 JavaScript。
strFile=>要包括在腳本塊中的腳本文件名,如c:\\a.js
父元素<job>,可以有很多個(gè),語(yǔ)言不必相同
<unnamed><unnamed name = unnamedname
helpstring = helpstring
?many = boolean required = boolean/ integer/>
name=>用于在用法中表示該參數(shù)的字符串。該值不用在別處。
Helpstring=>此參數(shù)的說(shuō)明文檔。WSH運(yùn)行時(shí)使用ShowUsage()或 /? 獲取參數(shù)文檔
many=>可選,布爾值。如果為true,則該參數(shù)重復(fù)的次數(shù)可以比由required屬性指定的次數(shù)多;否則,required屬性正好表示要使用所需參數(shù)的次數(shù)。
Required=>可選。指明該參數(shù)在命令行中出現(xiàn)次數(shù)的整數(shù)值。?
當(dāng)設(shè)置“必需”屬性時(shí),布爾值將被轉(zhuǎn)換成整數(shù);"true" 變成 1,而 "false" 變成 0??梢杂泻芏鄠€(gè)。比如<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>元素中其它元素動(dòng)態(tài)生成的文檔父元素<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>

執(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 選項(xiàng): 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>元素的各個(gè)子元素提供的信息,動(dòng)態(tài)生成的調(diào)用方式

第6-9行,是由WScript.exe或CScript.exe根據(jù)<runtime>元素的各個(gè)<named>/<unnamed>元素提供的信息,生成的參數(shù)說(shuō)明,即<參數(shù)名>:<description>

第10行,最后一行直接顯示的是<example>元素的內(nèi)容。

因?yàn)閚ote參數(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 選項(xiàng): 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é)果。

可見(jiàn),如果一個(gè)WSF腳本中包含多個(gè)<job>,而在調(diào)用時(shí)沒(méi)有指定調(diào)用哪個(gè)job,就默認(rèn)會(huì)執(zhí)行第一個(gè)job的所有<script>塊的代碼。如果想調(diào)用第二個(gè)job,可以執(zhí)行cscript //nologo //job:vbs Test.wsf,其結(jié)果如下:

1 C:\Users\nutix\Desktop\test.wsf(68, 14) Microsoft VBScript 運(yùn)行時(shí)錯(cuò)誤: 無(wú)效的過(guò)程調(diào)用或參 數(shù): 'getResource'

顯然這里無(wú)法訪問(wèn)//Job:js中的resource.

4.組合不同語(yǔ)言的代碼

【1】通過(guò)<script>塊的src引用外部代碼

1 <package> 2 <job id="IncludeExample"> 3 <script language="JScript" src="GetFreeSpace.JS"/> 4 <script language="VBScript"> 5 '獲得驅(qū)動(dòng)器 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】直接將不同語(yǔ)言的代碼寫進(jìn)同一個(gè)WSF腳本文件中,這只需要使用多種語(yǔ)言的<script>塊就行了。

5.WSH文件,這是一種簡(jiǎn)單的配置文件,它的作用和腳本文件右鍵》屬性》腳本選項(xiàng)卡的內(nèi)容一樣,可設(shè)置項(xiàng)很少很簡(jiǎn)單,下面是一個(gè)例子:

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

注意:Path指定的腳本文件必須存在,且可以被WScript或CScript解釋執(zhí)行。其它設(shè)置項(xiàng):Timeout:設(shè)置超時(shí)時(shí)間,超時(shí)時(shí)自動(dòng)終止執(zhí)行,DisplayLogo:是否顯示徽標(biāo),BatchMode:是否以批處理模式執(zhí)行

?6.使用WSF替代VBS/JS的理由:

【1】可聯(lián)合使用VBS/JS的標(biāo)準(zhǔn)庫(kù)

【2】可更友好的支持命令行:可提供充足詳實(shí)的命令行文檔及調(diào)用控制

【3】可方便地導(dǎo)入現(xiàn)有的代碼模塊

【4】可更方便地對(duì)功能進(jìn)行集成:借助<Job>元素

【5】支持直接向網(wǎng)頁(yè)的移植

【6】更便利的跨語(yǔ)言的全局對(duì)象,只要不同語(yǔ)言的<Script>塊處于同一個(gè)<Job>塊中,這個(gè)塊中的全局變量是跨語(yǔ)言公用的

轉(zhuǎn)載于:https://www.cnblogs.com/vitrox/p/5137441.html

總結(jié)

以上是生活随笔為你收集整理的WSF脚本详解:JS和VBS互调用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。