常用的JScript程式碼整理

c-xuan發表於2019-02-27


JScript並不是我們熟知的JavaScript,但是跟JavaScript很像,如果要在Windows環境中做一些自動化工作,比直接寫BAT批處理指令碼要簡單些。

JScript是由微軟公司開發的活動指令碼語言,是微軟對ECMAScript規範的實現。JScript最初是隨Internet Explorer 3.0於1996年8月釋出。在網路程式設計師談論Internet Explorer中的JavaScript的時候,他們實際上是指JScript。和其他活動指令碼一樣,它後來也被Windows Script Host(WSH)和Active Server Pages所支援。典型的JScript原始檔使用的副檔名是.js。JScript最新的版本是基於尚未定稿的ECMAScript4.0版規範的JScript .NET,並且可以在微軟的.Net環境下編譯。JScript在ECMA的規範上增加了許多特性。 ——百度百科

準備

測試環境:Windows 10 專業版

測試資料夾目錄結構如下:

	testfolder
	|---test.bat
	|---test.js
	|---folder1
	|---|---folder1.1
	|---|---folder1.2
	|---|---a.txt
	|---|---b.txt
	|---|---c.txt

test.bat是批處理檔案,測試的時候直接點選這個檔案執行,該檔案內容如下:

@rem 
@rem 
@rem 我是註釋
@rem 

cscript ./test.js

pause

test.js檔案是具體放JScript程式碼的地方,將下列功能的程式碼放在這裡。

特別注意:中文系統下,將所有檔案的編碼格式改為GB2312,否則有亂碼導致程式存在中文時有異常。

遍歷資料夾

/*******************************************
*遍歷所有子資料夾
*******************************************/
var folderPath = "./folder1";
var folers = GetFolderList(folderPath);
for (; !folers.atEnd(); folers.moveNext())
{
	var folderName = folers.item();
	WScript.Echo("資料夾名稱:"+folderName.Name);
	WScript.Echo("資料夾路徑:"+folderName);
}

/*******************************************
*獲取指定路徑資料夾下的所有子資料夾
*@folderspec:資料夾路徑
*return:子資料夾集合
*******************************************/
function GetFolderList(folderspec)
{
   var fso, f, fc;
   fso = new ActiveXObject("Scripting.FileSystemObject");
   f = fso.GetFolder(folderspec);
   fc = new Enumerator(f.SubFolders);
   return(fc);
}

輸出結果:

C:\Users\Administrator\Desktop\testfolder>cscript ./test.js
Microsoft (R) Windows Script Host Version 5.812
版權所有(C) Microsoft Corporation。保留所有權利。

資料夾名稱:folder1.1
資料夾路徑:C:\Users\Administrator\Desktop\testfolder\folder1\folder1.1
資料夾名稱:folder1.2
資料夾路徑:C:\Users\Administrator\Desktop\testfolder\folder1\folder1.2

C:\Users\Administrator\Desktop\testfolder>pause
請按任意鍵繼續. . .

遍歷所有檔案

/*******************************************
*遍歷所有檔案
*******************************************/
var folderPath = "./folder1";
var files = GetFolderFileList(folderPath);
for (; !files.atEnd(); files.moveNext())
{
	var fileName = files.item();
	WScript.Echo("檔名稱:"+fileName.Name);
	WScript.Echo("檔案路徑:"+fileName);
}

/*******************************************
*獲取指定資料夾路徑下的所有檔案
*@folderspec:資料夾路徑
*return:資料夾下的檔案集合
*******************************************/
function GetFolderFileList(folderspec)
{   
    var fso, folder, files;
    fso = new ActiveXObject("Scripting.FileSystemObject");
    folder = fso.GetFolder(folderspec);
    files = new Enumerator(folder.files);
    return files;
}

輸出結果:

C:\Users\Administrator\Desktop\testfolder>cscript ./test.js
Microsoft (R) Windows Script Host Version 5.812
版權所有(C) Microsoft Corporation。保留所有權利。

檔名稱:a.txt
檔案路徑:C:\Users\Administrator\Desktop\testfolder\folder1\a.txt
檔名稱:b.txt
檔案路徑:C:\Users\Administrator\Desktop\testfolder\folder1\b.txt
檔名稱:c.txt
檔案路徑:C:\Users\Administrator\Desktop\testfolder\folder1\c.txt

C:\Users\Administrator\Desktop\testfolder>pause
請按任意鍵繼續. . .

獲取檔案MD5值

有時候需要找出修改的檔案,對比檔案MD5值是有用的,耗時看檔案大小,檔案太大時間可能很長。

/*******************************************
*遍歷所有檔案,獲取檔案MD5值
*******************************************/
var folderPath = "./folder1";
var files = GetFolderFileList(folderPath);
for (; !files.atEnd(); files.moveNext())
{
	var fileName = files.item();
	WScript.Echo(fileName.Name+"的MD5值:"+GetFileMD5(fileName));
}

/*******************************************
*獲取指定資料夾路徑下的所有檔案
*@folderspec:資料夾路徑
*return:資料夾下的檔案集合
*******************************************/
function GetFolderFileList(folderspec)
{   
    var fso, folder, files;
    fso = new ActiveXObject("Scripting.FileSystemObject");
    folder = fso.GetFolder(folderspec);
    files = new Enumerator(folder.files);
    return files;
}

/*******************************************
*獲取檔案MD5值
*@filePath:指令碼檔案絕對路徑
*******************************************/
function GetFileMD5(filePath)
{
	var objShell = new ActiveXObject("WScript.Shell");
	var iReturnMsg = objShell.Exec("cmd.exe /c certutil -hashfile \""+filePath+"\" MD5");
	var result = iReturnMsg.StdOut.ReadAll();
	var splitArr = result.split("\n");
	var fileMD5 = splitArr[1].replace(/\s/g,"");
	return fileMD5;
	//WScript.Echo(fileMD5);
}

輸出結果:

C:\Users\Administrator\Desktop\testfolder>cscript ./test.js
Microsoft (R) Windows Script Host Version 5.812
版權所有(C) Microsoft Corporation。保留所有權利。

a.txt的MD5值:22d42eb002cefa81e9ad604ea57bc01d
b.txt的MD5值:1efc98f0102b2109fb90307e6e1c484e
c.txt的MD5值:ba2ee8e2ba48e6667dca8c83dab38f4c

C:\Users\Administrator\Desktop\testfolder>pause
請按任意鍵繼續. . .

建立Excel檔案

CreateExcelFile("./texcel.xlsx",3);

/*******************************************
*建立Excel檔案
*@filePathName:檔案路徑,相對路徑或絕對路徑
*@sheetCount:Excel中Sheet的個數
*******************************************/
function CreateExcelFile(filePathName,sheetCount)
{
	try{
		var ExcelApp = new ActiveXObject("Excel.Application");
		var WshShell = WScript.CreateObject ("WScript.Shell");
		var currentPath = WshShell.CurrentDirectory;
		var i;
		
		ExcelApp.Visible = false;
		ExcelApp.DisplayAlerts = false;
		var ExcelBook = ExcelApp.Workbooks.Add;
		
		for (i=1;i<sheetCount;++i)
		{
			ExcelBook.Worksheets.Add;
		}
		
		if (filePathName.indexOf(".") == 0)
		{
			currentPath = currentPath + filePathName.slice(1);
		}else{
			currentPath = filePathName;
		}
		
		currentPath = currentPath.replace(/\//g,"\\");
		//currentPath = currentPath.replace(/\\/g,"\\\\"); 路徑在變數中不用轉義

		//儲存表格
		ExcelBook.SaveAs(currentPath);
	}catch(e){
		WScript.Echo("發生異常:"+e);
	}finally{
		//用 Application 物件用 Quit 方法關閉 Excel。
		ExcelApp.Quit();
	}
}

更多

相關文章