现在的位置: 首页 > 综合 > 正文

跟我一起写Windows JS脚本(一):Hello World

2013年08月15日 ⁄ 综合 ⁄ 共 5064字 ⁄ 字号 评论关闭
文章目录

作者:yurunsun@gmail.com
新浪微博@孙雨润
新浪博客
CSDN博客
日期: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();

抱歉!评论已关闭.