WSF腳本詳解:組合JS和VBS代碼完成作業

来源:http://www.cnblogs.com/vitrox/archive/2016/01/17/5137441.html
-Advertisement-
Play Games

1.概述 Windows Script Host除了提供一個對象模型之外,還提供了一種腳本框架,這就是WSF腳本。通過WSF約定的標記元素,可以將多種腳本語言寫的代碼塊組合起來,完成任務。除此之外,還可以實現一些DOS沒有的命令功能,通過CScript xxx.wsf /?來查看幫助文檔,幫助文檔....


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:是否以批處理模式執行

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 雖然一般UWP開發還是依賴.Net for UWP,但有時還是需要調用WinRT API。特別是在IO部分,WinRT有著和.Net似曾相識但又不盡相同的介面。在此對經常用到的一些地方進行一下整理。WinRT IOStream和.Net的Stream體系類似,WinRT中也存在一系統的IO流介面。和...
  • 剛剛申請的時候還是非常急切地想知道,什麼時候能收到管理員同意自己開通的通知,沒想到剛一收到的時候,自己開始糾結第一篇文章寫點什麼。我想,不如來分享自己的一小段代碼吧?1 var Response = HttpContext.Current.Response;2 Response.ContentTyp...
  • readonly與const在C#中,readonly 與 const 都是定義常量,但不同之處在於:readonly 是運行時常量,而 const 是編譯時常量。public const int intValue = 100;public void Test(){ Console.Write...
  • 9-2. 用WCF更新單獨分離的實體問題你想通過WCF為一個數據存儲發佈查詢,插入,刪除和修改,並且使這些操作儘可能地簡單此外,你想通過Code First方式實現EF6的數據訪問管理解決方案假設有如Figure 9-2所示模型.Figure 9-2. 博客的posts(博文)和comments(評...
  • 第九章 在N層結構的應用程式中使用EF不是所有的應用都能完全地寫入到一個單個的過程中(就是駐留在一個單一的物理層中),實際上,在當今不斷發展的網路世界,大量的應用程式的結構包含經典的表現層,應用程,和數據層,並且它們可能分佈在多台電腦上,被分佈到一臺單獨的電腦上的應用程式的某個領域的邏輯層,並不...
  • 在Web開發過程中,會產生很多的js/css文件,傳統的引用外部文件的方式會產生多次的http請求,從而加重伺服器負擔且網頁載入緩慢,如何在一次請求中將多個文件一次載入出來?接下來給大家介紹在ASP.NET中動態合併載入多個js或css文件。原理:減少請求伺服器的次數達到優化效果先給大家看一下傳統引...
  • 本次給大家分享的是ajaxfileupload文件上傳插件,百度一大堆功能超炫的文件上傳插件,為什麼我們會選擇這個插件呢?原因是在此之前,我們嘗試使用過很多基於flash的上傳插件,但由於相容性,適用性等諸多問題,最終我們選擇了—ajaxfileupload.js,由於它使用的原生input標簽實現...
  • 前不久產品經理提出一個X的需求,說上傳office文件的時候需要將首頁自動截圖,用於顯示文件列表的時候將文件第一頁縮略圖展示給用戶。實現的方式有多種,這裡給大家介紹一個簡單實用的方案,用起來非常方便。1.Aspose.Pdf實現將pdf轉換為圖片功能,獲取pdf文件流 通過aspose讀取第一頁保存...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...