作者:[email protected] 新浪微博@孙雨润 新浪博客 CSDN博客日期:2012年11月1日
工作中经常需要写一些自动化工具,脚本无疑是最合适的选择。但选择哪种脚本语言常常让人头疼,perl/python需要先熟悉语法再熟悉库还要求运行机器安装,bat批处理的语法更为变态而且已经过时,vbs常被当成病毒,powershell同样面临学习语法和库的问题同时还要运行在.net平台上……有没有一种不需要学习语法、不需要学习对象、不需要额外安装、XP系统以上都支持的脚本语言呢,那就是javascript。
大家熟知的JS是作为最流行的脚本语言运行在浏览器中,浏览器中的JS能做以下两方面事情:
调用对象的属性方法
window.location.assign("http://www.yy.com");
对事件作出响应
<input type="text" id="email" onchange="checkEmail()">
这些功能实际是浏览器提供的:浏览器的JS解释器对JS代码解释执行、提供一些内建对象、并在需要事件通知时回调JS函数。自然想到:如果提供解释器、对象、事件回调,JS就能在除浏览器之外的场合发挥作用。例如Qt库中QtScript就是这样一个脚本运行环境,用Qt开发的软件都倾向于使用JS取代传统的C++ dll方式开发插件.
相比第三方库Qt,从Windows 98开始就自带这样一个环境,允许脚本调用操作系统内建对象,管理文件系统、网络、I/O等等,官方名称叫做WSH(Windows Script Host) —— Windows脚本宿主。
严格地说:WSH是一个与语言无关的脚本引擎,利用COM/OLE技术提供了与语言无关的二进制兼容(官方名字是自动化技术),实现了REXX, BASIC, Perl, Ruby, Tcl, PHP, JavaScript, Delphi, Python, XSLT, Powershell等十几种脚本的支持。
当然任何一种语言都能用Notepad开发,不过由于我们要大量使用windows内建对象,与其查阅各种文档弄清楚对象提供的方法属性,不如使用友好方便的IDE。这里推荐老牌脚本IDEPrimalSCRIPT,猛击此处下载试用版。
代码量不大的调试可以使用万能方法:打印输出
WScript.Echo("The size of array = " + arr.length);
推荐使用IDE的断点、watch功能,调试bug不在话下
文件以.js作为后缀名,有以下几种运行方式:
进入cmd命令行,输入
WScript.exe test.js
进入cmd命令行,输入
CScript.exe test.js
WScript与CStrip的区别主要是前者以UI方式交互,后者以控制台输入输出方式交互。
鼠标双击.js文件,默认以WScript.exe运行
下面提供一些实用功能的小例子体验一下,下一节详细讲解常用对象的实用。
作用:输出Hello World
WScript.Echo("Hello World");
保存成Hello.js并双击。会弹出一个MessageBox写着Hello World。如果是IDE中运行会在输出框中看到"Hello World"字符串。
作用:在桌面创建notepad.exe的快捷方式
var sh = WScript.CreateObject("WScript.Shell");
desktop = sh.SpecialFolders("Desktop");
shortcut = sh.CreateShortcut(desktop + "\\记事本快捷方式.lnk");
shortcut.TargetPath = "c:\\Windows\\notepad.exe";
shortcut.Save();
作用:打开记事本并立即执行后续脚本,模拟一段按键
var sh = WScript.CreateObject("WScript.Shell");
sh.Run("notepad " + WScript.ScriptFullName);
WScript.Sleep(1000);
sh.SendKeys("what the hell are you doing?");
作用:打开记事本并等待记事本关闭再继续执行后续脚本
var sh = WScript.CreateObject("WScript.Shell");
sh.Run("notepad " + WScript.ScriptFullName, 1, true);
sh.Popup("记事本已经被关闭!");
作用:打开QQ并模拟回车键自动登录(如果保存了用户名密码的话)
var sh = WScript.CreateObject("WScript.Shell");
try {
WScript.Echo("launch qq...");
var path = "\"D:\\Program Files\\Tencent\\QQ\\Bin\\QQ.exe\"";
sh.Run(path);
sh.SendKeys("{ENTER}");
} catch(e) {
WScript.Echo(e);
}
作用:输出桌面所有文件名字
var fso = WScript.CreateObject("Scripting.FileSystemObject");
var dir="C:\\Users\\Administrator\\Desktop";
var fsofolder = fso.GetFolder(dir);
var colFiles = fsofolder.Files;
var fc = new Enumerator( colFiles );
WScript.Echo("Files under \""+dir+"\":");
for (; !fc.atEnd(); fc.moveNext() ){
WScript.Echo(fc.item());
}
作用:列出磁盘相关属性
var fso = WScript.CreateObject("Scripting.FileSystemObject");
var driveTypeNames=["未知类型", "可移动磁盘", "硬盘", "网络磁盘驱动器", "光盘", "虚拟磁盘"];
var e = new Enumerator(fso.Drives);
var 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 + "字节");
}
}
作用:获取文件详细信息
var fileName = WScript.ScriptFullName;
var fso = WScript.CreateObject("Scripting.FileSystemObject");
var f = fso.GetFile(fileName);
var fileinfo = "Results for " + fileName + "\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);
作用:显示当前时间:
var today = new Date();
WScript.Echo("现在是:"+today.toLocaleString());
作用:列出操作系统环境变量
var sh = WScript.CreateObject("WScript.Shell");
var envObj = sh.Environment("SYSTEM");
WScript.Echo("====== 所有的系统环境变量列表:======");
WScript.Echo("No. of env. variables = "+envObj.length);
var it = new Enumerator(envObj)
for (it.moveFirst(); !it.atEnd(); it.moveNext()) {
WScript.Echo(it.item()+" ===> "+envObj(it.item()));
}
作用:抓取网页并保存到文件
var http = WScript.CreateObject("WinHttp.WinHttpRequest.5.1");
http.Option(4) = 13056;
http.Option(6) = false;
http.Open("GET", "http://www.baidu.com/", false);
http.SetRequestHeader("Accept", "*/*");
http.SetRequestHeader("Accept-Language", "zh-cn,zh");
http.SetRequestHeader("User-Agent", "Mozilla/6.0");
http.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
http.SetRequestHeader("Referer", "http://www.baidu.com/");
http.SetRequestHeader("Connection", "Close ");
http.SetRequestHeader("Content-Length", "100");
http.Send();
http.WaitForResponse(1000);
WScript.Echo(http.ResponseText);
var fs = WScript.CreateObject("Scripting.FileSystemObject");
var file = fs.CreateTextFile("output.html", true);
file.Write(http.ResponseText);
作用:访问WMPlayer控件播放音乐
var wmp = WScript.CreateObject("WMPlayer.OCX");
wmp.URL = "E:\\360云盘\\music\\阿桑-受了点伤\\让我爱.mp3";
WScript.Sleep(2000);
WScript.Sleep(wmp.currentMedia.duration * 1000);
WScript.Quit();