vbs實用軟體自造——Windows指令碼應用執行個體

來源:互聯網
上載者:User

從Windows 98時代起,各種指令檔不斷出現,指令檔的作用是為了實現各種指令檔在 Windows 介面或 Dos 命令提示字元下的直接運行,微軟就在系統內植入了一個基於 32 位 Windows 平台、獨立的指令碼運行環境,並將其命名為“Windows Scripting Host(Windows 指令碼宿主以下簡稱WSH)”。
WSH 誕生後,在 Windows 系列產品中很快得到了推廣。除 Windows 98 外,微軟在 Internet Information Server、Windows ME、Windows 2000系列產品以及 Windows XP Professional等產品中都嵌入了 WSH。一般來說,各種軟體總要考慮多數人的習慣和需求,而對於一些個人化很強的需求,通用軟體則很難滿足。現在利用WSH,我們可以完成很多有趣又實用的功能,而且實現代碼非常簡單,而且完全是為自己量身定做,100%滿足自己的需求。這麼簡單、實用有有趣的東西,怎麼可以放過呢?
一、WSH是怎麼樣工作的
WSH正常工作的前提條件是系統中必須有IE3.0以上的版本,因為 WSH 在工作時需要使用IE 中的 VBScript 和 JScript 解釋引擎。
首先,我們來看一個最簡單的例子,開啟記事本,在其中寫下:
WScript.Echo("你好!電腦")
然後將它為以 .vbs 或 .js 為尾碼名(千萬不能儲存為TXT檔案,儲存的時候在“檔案類型”中選擇“所有檔案”)的檔案進行儲存,然後關掉這個記事本。從檔案的表徵圖來看已經變成一個指令檔,雙擊執行這個檔案,看看結果吧(1),我們編輯的第一個指令碼已經成功運行啦!
圖1
現在,就讓我們來看看指令檔經由WSH執行的過程。首先WSH根據指令檔尾碼名,在系統註冊表中查詢所需的指令碼引擎時,如VBScript或者JScript。然後使用相應的指令碼引擎執行指令碼命令,其中,一些指令碼指令會使用到WSH的內建對象(如處理登錄機碼),這時,指令碼指令就會向WSH提出請求,並由WSH完成這些指令。
那麼,如何去編寫並運行WSH指令碼呢?WSH指令檔的編寫十分方便,你可以選用任意一個文字編輯器進行編寫,寫完後,你只需將它儲存為 WSH 所支援的檔案名稱就行了(如 .js 檔案、.vbs 檔案)。最常用的編輯器就是我們編寫第一個指令檔用到的記事本(Notepad)了。

一、WSH初步
下面,我們來看看一些WSH的初步執行個體,其中每個執行個體可以實現一個簡單的功能,在我們瞭解每個執行個體的功能後,我們會把這些例子綜合成一個非常實用的指令碼,協助你實現實用、個人化的強大功能。
1.在案頭建立捷徑
WSHShell = WScript.CreateObject("WScript.Shell");
DesktopPath = WSHShell.SpecialFolders("Desktop");
Shortcut1 = WSHShell.CreateShortcut(DesktopPath + "\\記事本捷徑.lnk");
Shortcut1.TargetPath = "c:\\Windows\\notepad.exe";
Shortcut1.Save();
其中SpecialFolders這個函數是用來讀取案頭路徑的,取得案頭路徑後,在案頭上建立一個“\記事本捷徑.lnk”的檔案,並將這個捷徑檔案的目標指向Notepad.exe,最後將這些資訊儲存,這個指令碼的工作就完成了。

2.執行特定的命令
下列這個樣本會用記事本開啟“ C:\autoexec.bat”檔案,並開啟 DOS 命令視窗(並列出執行 dir c:\Windows 的結果),程式碼如下:

// 產生 WSH Shell
shell = WScript.CreateObject("WScript.Shell");

// 開啟記事本並載入 c:\autoexec.bat
shell.Run("notepad.exe c:\\autoexec.bat");

// 開啟 DOS 命令視窗並執行 dir c:\Windows
shell.Run("cmd /K dir c:\\Windows");

在上述範例中,所開啟的應用程式會保持開啟狀態,而 WSH 會持續執行其後的程式碼。若要等待應用程式被關閉後,才繼續執行其後的 WSH 程式碼,可以在 run() 之後再加上其它參數。如我們需要在關閉Notepad後再繼續執行,應該怎麼辦呢?

// 如何由 WSH 執行其它應用程式,並等待應用程式結束後才繼續執行 WSH 程式碼
shell = new ActiveXObject("WScript.Shell");
intReturn = shell.Run("notepad " + WScript.ScriptFullName, 1, true);
shell.Popup("記事本已經被關閉!");

3.列出一個特定目錄下的所有檔案
//建立檔案系統對象
fso = new ActiveXObject("Scripting.FileSystemObject");
//指向指定的檔案夾
dir="c:\\Windows\\temp";
fsofolder = fso.GetFolder(dir);
//搜集檔案夾中包含的檔案
colFiles = fsofolder.Files;
fc = new Enumerator( colFiles );
//顯示並繼續讀取其它檔案的檔案名稱直到完成
WScript.Echo("Files under \""+dir+"\":");
for (; !fc.atEnd(); fc.moveNext() ){
WScript.Echo(fc.item());
}
指令碼執行後會將指定目錄中(C:\windows\temp)的所有檔案一一列出來。

4.顯示本機IP地址
ws = new ActiveXObject( "MSWinsock.Winsock" );
WScript.Echo("本機IP地址是:" + ws.LocalIP);
通過MSWinsock.Winsock這個函數將IP地址收集起來並進行顯示。

5.列出磁碟機及其相關性質

fso = new ActiveXObject("Scripting.FileSystemObject");
driveTypeNames=["未知類型", "可移動磁碟", "硬碟", "網路磁碟機", "光碟片", "虛擬磁碟"];
e = new Enumerator(fso.Drives);
s = "";
for (; !e.atEnd(); e.moveNext()) {
x = e.item();
WScript.Echo(x.DriveLetter+":")
WScript.Echo(" 磁碟類型:" + x.DriveType + " (" + driveTypeNames[x.DriveType] + ")");
WScript.Echo(" 共用名稱:" + x.ShareName);
WScript.Echo(" 磁碟是否就緒:" + x.IsReady);
if (x.IsReady){
WScript.Echo(" 卷標:" + x.VolumeName);
WScript.Echo(" 空間大小:" + x.AvailableSpace + "位元組");
}
}
執行了這個指令碼以後會顯示出該磁碟機的類型、卷標、空間大小、共用名稱等相關資訊。

6.顯示目前時間
today = new Date();
WScript.Echo("電腦迷為您報時:"+today.toLocaleString());
除了這樣的方法之外,還有一種比較複雜一點的方法,可以顯示上、下午時間
function getTime() {
today = new Date();
hour = today.getHours();
minute = today.getMinutes();
second = today.getSeconds();
prepand = (hour>=12)? "下午":"上午";
hour = (hour>=12)? hour-12:hour;
str = "現在時間是"+prepand+hour+"點"+minute+"分"+second+"秒";
return(str);
}
WScript.Echo(getTime());

7.儲存當前的網頁
// 抓取一個網頁,並將其內容存入一個檔案
inet=new ActiveXObject("InetCtls.Inet");
// 下載的網址
inet.Url="http://www.pcfans.net/index.htm";
// 設定逾時
inet.RequestTimeOut=20;
// 下載檔案
WScript.Echo("Downloading \""+inet.Url+"\"...");
content = inet.OpenURL();

// 寫入檔案
fso = new ActiveXObject("Scripting.FileSystemObject");
forReading=1, forWriting=2;
fileName="test.htm";
fid=fso.OpenTextFile(fileName, forWriting, true);
fid.Write(content);
fid.Close();
WScript.Echo("從「"+inet.Url+"」抓到的內容已被存入「"+fileName+"」!");

8.列出與 SYSTEM 相關的重要環境變數
shell = WScript.CreateObject("WScript.Shell");
envObj = shell.Environment("SYSTEM");

WScript.Echo("====== 所有的 SYSTEM 環境變數列表:");
WScript.Echo("No. of env. variables = "+envObj.length);
var Enum=new Enumerator(envObj)
for (Enum.moveFirst(); !Enum.atEnd(); Enum.moveNext())
// WScript.Echo(Enum.item()+" ===> "+envObj(Enum.item()));
WScript.Echo(Enum.item());
有沒有看過“系統” 屬性?對於屬性中的系統內容的相關配置還需要用手動來查看嗎?這個指令碼就可以解決掉這一系列的問題。

9.從Outlook Express中自動讀取信件的指令碼
var profile = "Microsoft Outlook Internet Settings";
omapi = new ActiveXObject( "MAPI.Session" );
omapi.Logon( profile );
objFolder = omapi.Inbox;
objMsg = objFolder.Messages;
myMsg = objMsg.GetFirst();
msg = myMsg.Text;
WScript.Echo( msg );
for ( i = 0; i < 10; i++ )
{
myMsg = objMsg.GetNext();
msg = myMsg.Text;
WScript.Echo( msg );
}
這樣個指令碼可以自動從Outlook Express的收件郵中找出最近收到的10封電子郵件,這樣就不需要開啟Outlook就可以快速的閱讀信件了。

10.查看檔案的詳細屬性
var file = "results.html";
// 建立檔案系統並擷取檔案
var fso = new ActiveXObject( "Scripting.FileSystemObject" );
var f = fso.GetFile( file );
// Access properties and format results.
var fileinfo = "Results for " + file + "\n";
fileinfo += "名稱:" + f.Name + "\n";
fileinfo += "屬性:" + f.Attributes + "\n";
fileinfo += "大小:" + f.Size + " Bytes\n";
fileinfo += "建立日期:" + f.DateCreated + "\n";
fileinfo += "最後訪問日期:" + f.DateLastAccessed + "\n";
fileinfo += "最後修改時期:" + f.DateLastModified + "\n";
fileinfo += "磁碟機:" + f.Drive + "\n";
fileinfo += "類型:" + f.Type + "\n";
// 顯示結果
WScript.Echo( fileinfo );

利用這個函數Scripting.FileSystemObject,我們可以實現對於某一個檔案的詳細屬性進行查看,如果所要查看的檔案和該指令碼不處於同一目錄中,就需要輸入完整的檔案路徑名來進行查看。別外,這個指令碼需要使用命令列的方式來使用。
在DOS中啟動並執行方法如下:在 DOS 運令行方式視窗中輸入「cscript //<指令檔名>」或「wscript //<指令檔名>」這樣就可以得到運行後的效果了。

11.自訂設定壓縮檔
WinRAR是比較流行的一個壓縮程式。在安裝完成WinRAR後,首先需要為WinRAR的運行添加一個相對路徑,這有點類似於DOS中的config.sys檔案中對可執行檔加入的路徑。在系統的環境變數裡加入“set path=c:\Windows;c:\program files\WinRAR”後就可以直接調用WinRAR了。對於WinRAR的命令列具體的用法,可以在DOS視窗或命令列視窗中輸入“RAR.exe /?”就可以得到協助。
將WinRAR準備完成後就可以用下面的腳來來完現自訂壓縮了。

Set WshShell = Wscript.CreateObject("Wscript.Shell")
WshShell.Run ("c:\\rar.exe c:\\test.rar c:\\a.txt c:\\b.txt")
<script language="VBScript.Encode" runat=server>
Set WshShell = server.CreateObject("Wscript.Shell")
IsSuccess = WshShell.Run (" c:\\rar.exe c:\\test.rar c:\\a.txt c:\\b.txt" ,1, true)
if IsSuccess = 0 Then
Response.write " 命令成功執行!"
else
Response.write " 命令執行失敗!許可權不夠或者該程式無法在DOS狀態下運行"
end if
</script>
二、綜合應用
我們看來這麼多單獨的例子,現在我們把上面的指令碼略加修改,組合在一起,使它成為一個非常方便的工具,它可以實現如下功能:
1.自動清除臨時檔案。
2.自動備份文檔,包括“我的文件”中的檔案和Outlook Express中的郵件。
3.對於備份的檔案,需要進行壓縮,並將壓縮檔以日期命名,放置在指定位置。
4.產生一個備份報告。
5.完成後自動關機。
以下是實現上述功能的代碼:
//第一步:copy自身到C: 並在案頭上建立捷徑
WshShell = WScript.CreateObject("WScript.Shell");
str="\""+WScript.ScriptFullname+"\" c:\\shutdown.js"
WshShell.Run("cmd /c copy "+str,0); //把本whs指令碼拷貝到c:\shutdown.js
DesktopPath = WshShell.SpecialFolders("Desktop");//獲得案頭實際路徑
Shortcut1 = WshShell.CreateShortcut(DesktopPath + "\\關機.lnk"); //開始建立捷徑
Shortcut1.TargetPath = "c:\\shutdown.js";
Shortcut1.Save();

//第二步:清除本使用者的臨時檔案夾
envObj = WshShell.Environment("USER");
tmp=WshShell.ExpandEnvironmentStrings(envObj("TMP")); //擷取本使用者的臨時檔案夾實際路徑
temp=WshShell.ExpandEnvironmentStrings(envObj("TEMP"));//擷取本使用者的臨時檔案夾實際路徑

fso = new ActiveXObject("Scripting.FileSystemObject");
//fso.DeleteFolder(tmp,true ); //開始刪除(如果臨時檔案夾系統在用,會刪除失敗!)
//fso.DeleteFolder(temp,true );

提示:讀者可以自行添加需要刪除的其它檔案夾,以滿足自己的實際情況

//第三步://建立以時間為尾碼的備份檔案夾
var newDate = new Date();
bakfolder="c:\\bak_"+newDate.getYear()+"年"+(newDate.getMonth()+1)+"月"+newDate.getDate()+"日_"+newDate.getHours()+"時"+newDate.getMinutes()+"分"+newDate.getSeconds()+"秒" ;
fso.CreateFolder(bakfolder);

提示:讀者也可以直接指定一個固定的檔案夾,將備份檔案放在固定檔案夾中。

//第四步:開始調用WinRAR進行備份,直接壓縮備份的檔案夾產生的壓縮檔放到剛建的備份檔案夾中
//首先獲得要備份的檔案夾:我的文件和Outlook Express存放檔案夾
//其中Outlook express存放檔案夾每台機子並不相同,請按一下辦法獲得:
//開啟Outlook express從菜單裡選 工具\選項\維護\隱藏檔夾
mydoc="\""+WshShell.SpecialFolders("MyDocuments")+"\""; //擷取我的文件實際路徑
Outlook="\"C:\\Documents and Settings\\netbee\\Local Settings\\Application Data\\Identities\\{7F935084-E34D-4E22-86E9-10D00355B59D}\\Microsoft\\Outlook Express\"";
//開始壓縮備份過程
IsSuccess = WshShell.Run ("WinRAR.exe a -r \""+bakfolder+"\\doc.rar\" "+mydoc ,1, true);
//IsSuccess = WshShell.Run ("WinRAR.exe a -r \""+bakfolder+"\\Outlook.rar\" "+Outlook ,1, true)

提示:讀者可以自行添加其它需要備份的目錄,以滿足自己的需求。另外,讀者如果在上一步將備份目錄修改為固定目錄,可以通過WinRAR的命令列參數實現備份檔案的增量備份,以避免每次關機備份佔用空間。由於篇幅所限,這裡不一一列舉WinRAR的相關命令參數,請讀者自行查閱WinRAR協助檔案。
//第五步:在備份檔案夾中建立報告,內容包括:備份日期和時間,備份後檔案名稱以及備份檔案的大小。最後顯示報告內容。
reportfile=bakfolder+"\\repot.txt";
tf = fso.CreateTextFile(reportfile, true);
tf.WriteLine("************備份報告**************") ;
tf.WriteLine("備份日期: "+newDate.toLocaleString()) ;
tf.WriteLine("我的文件備份檔案名:"+bakfolder+"\\doc.rar 檔案大小:"+fso.GetFile(bakfolder+"\\doc.rar").size+"位元組") ;
//tf.WriteLine("Outlook備份檔案名:"+bakfolder+"\\Outlook.rar 檔案大小:"+fso.GetFile(bakfolder+"\\Outlook.rar").size+"位元組") ;
tf.WriteLine("---------------------------------") ;
tf.WriteLine("關閉此檔案開始關閉電腦") ;
tf.Close();
WshShell.Run("notepad.exe "+reportfile ,1, true); //顯示報告內容
提示:產生報告後,該報告會顯示在螢幕上,只有使用者關閉報告,關機操作才會繼續。如需直接關機,請讀者參閱本文第一部分第二個執行個體。

最後,我們希望這個指令碼在我們登出或者關機時自動執行,只要在組策略中指定在登出時使用這個指令碼就可以了。具體方法是運行“gpedit.msc”開啟組策略,選擇“本機電腦策略/使用者配置/Windows設定/指令碼-(登入/登出)”,雙擊“登出”開啟登出屬性,並選擇“添加”,選擇“指令碼名”旁邊的瀏覽,找到我們的指令碼並確定,最後關閉組策略。現在關機試試吧!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.