作者:yurunsun@gmail.com 新浪微博@孙雨润 新浪博客 优快云博客日期:2012年11月1日
1. Introduction to Windows JS
工作中经常需要写一些自动化工具,脚本无疑是最合适的选择。但选择哪种脚本语言常常让人头疼,perl/python需要先熟悉语法再熟悉库还要求运行机器安装,bat批处理的语法更为变态而且已经过时,vbs常被当成病毒,powershell同样面临学习语法和库的问题同时还要运行在.net平台上……有没有一种不需要学习语法、不需要学习对象、不需要额外安装、XP系统以上都支持的脚本语言呢,那就是javascript。
1.1 什么是Windows JS
大家熟知的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等十几种脚本的支持。
1.2 Windows JS能做什么
- 自动批处理
- 管理文件系统:如创建、删除、访问磁盘、文件、文件夹;文件读写
- 管理网络:如socket连接、ftp、smtp、http
- 管理I/O:标准输入输出、硬件设备
- 控制桌面Shell:快捷方式、桌面窗口
- 控制应用程序:获取word、excle、wmp、QQ等对象并调用方法
1.3 为什么使用Windows JS
- 脚本能极大提高工作效率
- js语言的学习成本几乎为0
- 开发插件安全稳定,不会影响其他模块
2. 开发、调试、运行
2.1 开发
当然任何一种语言都能用Notepad开发,不过由于我们要大量使用windows内建对象,与其查阅各种文档弄清楚对象提供的方法属性,不如使用友好方便的IDE。这里推荐老牌脚本IDEPrimalSCRIPT,猛击此处下载试用版。
2.2 调试
-
代码量不大的调试可以使用万能方法:打印输出
WScript.Echo("The size of array = " + arr.length);
-
推荐使用IDE的断点、watch功能,调试bug不在话下
2.3 运行
文件以.js作为后缀名,有以下几种运行方式:
-
进入cmd命令行,输入
WScript.exe test.js
-
进入cmd命令行,输入
CScript.exe test.js
WScript与CStrip的区别主要是前者以UI方式交互,后者以控制台输入输出方式交互。
-
鼠标双击.js文件,默认以WScript.exe运行
- IDE中运行,默认以CScript.exe运行
3. 实用功能抢先体验
下面提供一些实用功能的小例子体验一下,下一节详细讲解常用对象的实用。
3.1 Hello World
作用:输出Hello World
WScript.Echo("Hello World");
保存成Hello.js并双击。会弹出一个MessageBox写着Hello World。如果是IDE中运行会在输出框中看到"Hello World"字符串。
3.2 在桌面创建快捷方式
作用:在桌面创建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();
3.3 打开应用程序
-
作用:打开记事本并立即执行后续脚本,模拟一段按键
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); }
3.4 访问文件系统
-
作用:输出桌面所有文件名字
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);
3.5 时间函数
作用:显示当前时间:
var today = new Date();
WScript.Echo("现在是:"+today.toLocaleString());
3.6 环境变量
作用:列出操作系统环境变量
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()));
}
3.7 网络相关
作用:抓取网页并保存到文件
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);
3.8 调用COM/OLE控件
作用:访问WMPlayer控件播放音乐
var wmp = WScript.CreateObject("WMPlayer.OCX");
wmp.URL = "E:\\360云盘\\music\\阿桑-受了点伤\\让我爱.mp3";
WScript.Sleep(2000);
WScript.Sleep(wmp.currentMedia.duration * 1000);
WScript.Quit();