扩展名为hta的文件即:网页应用程序(Html Application)
这类程序中网页拥有本地安全访问级别,可以创建ActiveX对象、访问内存、文件、注册表、网络等等
本文介绍使用hta编写工具可能碰到的技术,包括:访问文本文件、数据库、xml文件、网络等等
【优势】
不需要安装开发和运行环境
记事本即可编写
浏览器即可运行
WEB开发人员容易上手VBScript、JavaScript
例子1 "hello.hta" 显示对话框
将内容存为"hello.hta"文件即可运行,后面的列子运行方式相同,不再说明
运行上面的程序,将显示出一个对话框,和普通网页完全一样
【访问文件】
例子2 "fileexists.hta" 判断文件目录是否存在
在hat中复杂操作都离不开ActiveX对象,ActiveXObject()是创建该对象的方法。
参数"Scripting.FileSystemObject"则是这个对象注册的名字
在注册表里可以找到:
这样程序就可以知道实际从哪个dll里载入ActiveX对象
Scripting.FileSystemObject明显是一个操作文件系统的对象
详细资料参考: http://msdn.microsoft.com/en-us/library/z9ty6h50(VS.85).aspx
【访问不同编码的文本文件】
现在程序越来越国际化,所以Unicdoe、UTF8编码非常流行
这样在处理文本文件的时候就会碰到不同编码的情况
例子3 "readtextfile.hta" 读取文本文件
Scripting.FileSystemObject可以处理Unicode编码但不能处理Utf8编码。
用ADODB.Stream则可以处理更多的编码;
该对象还可以按字节读取,可是我郁闷没有找到javascript中如何处理variant类型的方法,知道的请告之。
Variant = Stream .Read ( NumBytes )
【创建快捷方式】
例子4 "createshortcut.hta" 创建快捷方式
WScript.Shell是个好东东,shell.SpecialFolders("Desktop");这个方法就是获取桌面的路径
详细可以参考阿笨狗的网页: http://www.pifoo.com/post/WscriptShell.html
【访问XML】
XML目前是相当流行一种数据交互文件
例子5 "addxmlnode.hta" 添加节点
xmldocument.loadXML()是直接载入xml文本
xmldocument.load(fileName)从文件中载入
xmldocument.save(fileName)从保存到文件
例子6 "xpathdemo.hta" xpath演示
寻找xml节点最方便的就是使用xpath表达式
参考: http://www.w3.org/TR/xpath
【访问网络】
这个是ajax常用的“Microsoft.XMLHTTP”对象,当然本地安全级不用担心跨域问题。
这里就不多讲了,参考:
【脚本共享】优快云版主批量删帖工具。
优快云积分查询--清洁工2008版
【访问数据库】
使用ADODB.Connection链接数据。
例子7 "Access.hta" 创建Access数据库和执行插入和查询
【调用其他程序】
例子8 "runnotepad.hta" 打开记事本
例子9 "processes.hta" 遍历当前进程
例子10 "doscmd.hta" 执行dos命令
幻灯片 2
这类程序中网页拥有本地安全访问级别,可以创建ActiveX对象、访问内存、文件、注册表、网络等等
本文介绍使用hta编写工具可能碰到的技术,包括:访问文本文件、数据库、xml文件、网络等等
【优势】
不需要安装开发和运行环境
记事本即可编写
浏览器即可运行
WEB开发人员容易上手VBScript、JavaScript
例子1 "hello.hta" 显示对话框
- <html>
- <script type="text/javascript">
- alert("hello world");
- </script>
- </html>
运行上面的程序,将显示出一个对话框,和普通网页完全一样
【访问文件】
例子2 "fileexists.hta" 判断文件目录是否存在
- <html>
- <body>
- <div>
- <input id="TextFilename" type="text" value="c:/autoexec.bat" />
- <input type="button" value="判断文件是否存在" onclick="ButtonFileExists();" />
- </div>
- <div>
- <input id="TextFolder" type="text" value="c:/windows" />
- <input type="button" value="判断目录是否存在" onclick="ButtonFolderExists();" />
- </div>
- <script type="text/javascript">
- var $ = document.getElementById;
- function ButtonFileExists() {
- var fso = new ActiveXObject("Scripting.FileSystemObject");
- alert(fso.FileExists($("TextFilename").value) ? "文件存在" : "文件不存在");
- fso = null;
- }
- function ButtonFolderExists() {
- var fso = new ActiveXObject("Scripting.FileSystemObject");
- alert(fso.FolderExists($("TextFolder").value) ? "目录存在" : "目录不存在");
- fso = null;
- }
- </script>
- <body>
- </html>
参数"Scripting.FileSystemObject"则是这个对象注册的名字
在注册表里可以找到:
- HKEY_CLASSES_ROOT/Scripting.FileSystemObject/CLSID
- @={0D43FE01-F093-11CF-8940-00A0C9054228}
- ----
- HKEY_CLASSES_ROOT/CLSID/{0D43FE01-F093-11CF-8940-00A0C9054228}
- @=FileSystem Object
- ----
- HKEY_CLASSES_ROOT/CLSID/{0D43FE01-F093-11CF-8940-00A0C9054228}/InprocServer32
- @=C:/WINDOWS/system32/scrrun.dll
- ----
- HKEY_CLASSES_ROOT/CLSID/{0D43FE01-F093-11CF-8940-00A0C9054228}/ProgID
- @=Scripting.FileSystemObject
Scripting.FileSystemObject明显是一个操作文件系统的对象
详细资料参考: http://msdn.microsoft.com/en-us/library/z9ty6h50(VS.85).aspx
【访问不同编码的文本文件】
现在程序越来越国际化,所以Unicdoe、UTF8编码非常流行
这样在处理文本文件的时候就会碰到不同编码的情况
例子3 "readtextfile.hta" 读取文本文件
- <html>
- <body>
- <div>
- 文件名:<input id="TextFilename" type="text" value="tempUnicode.txt" />
- <input type="button" value="按gb2312读取" onclick="ButtonReadTextClick('gb2312');" />
- <input type="button" value="按Unicode读取" onclick="ButtonReadTextClick('Unicode');" />
- <input type="button" value="按UTF-8读取" onclick="ButtonReadTextClick('UTF-8');" />
- </div>
- <textarea id="TextareaText" style="height:400px;width:100%;"></textarea>
- <script type="text/javascript">
- var BinaryStreamType = 1;
- var TextStreamType = 2;
- var $ = document.getElementById;
- function ButtonReadTextClick(charset)
- {
- var adostream = new ActiveXObject("ADODB.Stream");
- adostream.Type = TextStreamType;
- if (typeof(charset) == "undefined") charset = charset;
- adostream.Charset = charset;
- adostream.Open();
- adostream.LoadFromFile($("TextFilename").value);
- var contents = adostream.ReadText();
- adostream.Close();
- adostream = null;
- $("TextareaText").value = contents;
- }
- </script>
- <body>
- </html>
用ADODB.Stream则可以处理更多的编码;
该对象还可以按字节读取,可是我郁闷没有找到javascript中如何处理variant类型的方法,知道的请告之。
Variant = Stream .Read ( NumBytes )
【创建快捷方式】
例子4 "createshortcut.hta" 创建快捷方式
- <html>
- <title>快捷方式--清洁工2008版</title>
- <body>
- <div>
- <input type="button" value="开始" onclick="ButtonStartClick();" id="ButtonStart" />
- </div>
- <script language="javascript" type="text/javascript">
- var $ = document.getElementById;
- function ButtonStartClick() {
- var shell = new ActiveXObject("WScript.Shell");
- var strDesktop = shell.SpecialFolders("Desktop");
- var link = shell.CreateShortcut(strDesktop + "//一个记事本.lnk");
- link.TargetPath = "notepad.exe";
- link.WorkingDirectory = "";
- link.Save();
- var link = shell.CreateShortcut(strDesktop + "//床上等你.url");
- link.TargetPath = "http://www.youkuaiyun.com";
- link.Save();
- link = null;
- shell = null;
- }
- </script>
- </body>
- </html>
详细可以参考阿笨狗的网页: http://www.pifoo.com/post/WscriptShell.html
【访问XML】
XML目前是相当流行一种数据交互文件
例子5 "addxmlnode.hta" 添加节点
- <html>
- <body>
- <div>
- <input type="button" value="测试" onclick="ButtonClick();" />
- </div>
- <textarea id="TextareaText" style="height:400px;width:100%;"></textarea>
- <script type="text/javascript">
- var $ = document.getElementById;
- function ButtonClick() {
- var xmldocument = new ActiveXObject("MSXML2.DOMDocument");
- xmldocument.loadXML("<?xml version=/"1.0/"?><root></root>");
- var root = xmldocument.documentElement;
- var newnode = root.appendChild(xmldocument.createElement("newnode"));
- newnode.setAttribute("att1", "1");
- newnode.setAttribute("att1", "2");
- newnode.text = "zswang 路过";
- $("TextareaText").value = xmldocument.xml;
- xmldocument = null;
- }
- </script>
- <body>
- </html>
xmldocument.load(fileName)从文件中载入
xmldocument.save(fileName)从保存到文件
例子6 "xpathdemo.hta" xpath演示
- <html>
- <body>
- <textarea id="TextareaXML" style="width:100%; height:45%">
- <?xml version="1.0"?>
- <test>
- <x a="1">
- <x a="2" b="B">
- <x>
- <y>y31</y>
- <y>y32</y>
- <y a="3">y33</y>
- </x>
- </x>
- </x>
- <y a="4">y11</y>
- </test>
- </textarea>
- <textarea id="TextareaText" style="width:100%; height:45%"></textarea>
- <button onclick="ButtonClick(this);" title="寻找Tag为y的节点">//y</button>
- <button onclick="ButtonClick(this);" title="寻找存在属性a的节点">//*[@a]</button>
- <button onclick="ButtonClick(this);" title="寻找文本为y31的节点">//y[.="y31"]</button>
- <button onclick="ButtonClick(this);" title="寻找Tag为y并且序号3的节点">//y[position()=3]</button>
- <script language="javascript">
- var $ = document.getElementById;
- var xmldocument = new ActiveXObject("MSXML2.DOMDocument");
- function ButtonClick(sender) {
- xmldocument.loadXML($("TextareaXML").value);
- xmldocument.setProperty("SelectionLanguage", "XPath");
- var nodes = xmldocument.selectNodes(sender.innerText);
- for (var i = 0; i < nodes.length; i++)
- nodes[i].setAttribute("find", "****");
- $("TextareaText").value = xmldocument.xml;
- }
- </script>
- </body>
- </html>
参考: http://www.w3.org/TR/xpath
【访问网络】
这个是ajax常用的“Microsoft.XMLHTTP”对象,当然本地安全级不用担心跨域问题。
这里就不多讲了,参考:
【脚本共享】优快云版主批量删帖工具。
优快云积分查询--清洁工2008版
【访问数据库】
使用ADODB.Connection链接数据。
例子7 "Access.hta" 创建Access数据库和执行插入和查询
- <html>
- <title>测试</title>
- <div>
- <input type="button" value="测试" onclick="ButtonStartClick();" id="ButtonStart" />
- </div>
- <div style="width:100%; height:80%">
- <textarea id="TextareaLog" style="width:100%; height:100%"></textarea>
- </div>
- <script language="javascript" type="text/javascript">
- var $ = document.getElementById;
- var accessfile = "temp.mdb";
- var adSchemaTables = 20;
- function ButtonStartClick() {
- var createDatabase = false;
- ///Begin 确保数据库文件存在
- var fso = new ActiveXObject("Scripting.FileSystemObject");
- if (!fso.FileExists(accessfile)) {
- var adoxcatalog = new ActiveXObject("ADOX.Catalog");
- try {
- adoxcatalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + accessfile);
- createDatabase = true;
- } catch(e) {
- return;
- }
- adoxcatalog = null;
- }
- ///End 确保数据库文件存在
- ///Begin 确保表存在
- var existsTable = false;
- var connection = new ActiveXObject("ADODB.Connection");
- try {
- connection.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + accessfile);
- if (!createDatabase) {
- var recordset = connection.OpenSchema(adSchemaTables);
- recordset.MoveFirst();
- while (!recordset.EOF) {
- if (recordset("TABLE_TYPE") == "TABLE") {
- existsTable = true;
- break;
- }
- recordset.MoveNext();
- }
- recordset.Close();
- recordset = null;
- }
- if (!existsTable) {
- connection.Execute("CREATE TABLE temp(记录号 Counter Primary key, 名称 Text(10))");
- connection.Execute("INSERT INTO temp(名称) values (/"zswang/")");
- connection.Execute("INSERT INTO temp(名称) values (/"hcat1999/")");
- connection.Execute("INSERT INTO temp(名称) values (/"ming4098/")");
- }
- } catch(e) {
- return;
- }
- ///End 确保表存在
- var recordset = new ActiveXObject("ADODB.Recordset");
- try {
- recordset.Open("SELECT * FROM temp", connection);
- recordset.MoveFirst();
- while (!recordset.EOF) {
- $("TextareaLog").value += recordset("名称") + "/r/n";
- recordset.MoveNext();
- }
- recordset.Close();
- recordset = null;
- } catch(e) {
- return;
- }
- connection.Close();
- }
- </script>
- </html>
例子8 "runnotepad.hta" 打开记事本
- <html>
- <body>
- <button onclick="ButtonClick();">打开记事本</button>
- <script type="text/javascript">
- var SW_HIDE = 0;
- var SW_NORMAL = 1;
- var SW_MINIMIZED = 2;
- var SW_MAXIMIZED = 3;
- var SW_NOACTIVATE = 4;
- var SW_SHOW = 5;
- var SW_MINIMIZE = 6;
- var SW_MINNOACTIVE = 7;
- var SW_SHOWNA = 8;
- var SW_RESTORE = 9;
- var SW_DEFAULT = 10;
- function ButtonClick() {
- var shell = new ActiveXObject("WScript.Shell");
- shell.Run("notepad.exe", SW_MAXIMIZED, true); // 执行并等待
- shell = null;
- }
- </script>
- </body>
- </html>
- <html>
- <body>
- <script>
- try {
- var locator = new ActiveXObject("WbemScripting.SWbemLocator");
- var service = locator.ConnectServer(".", "/root/CIMV2");
- var processes = service.ExecQuery("Select * from Win32_Process");
- var processEnum = new Enumerator(processes);
- var msg = "";
- for (; !processEnum.atEnd(); processEnum.moveNext())
- {
- var process = processEnum.item();
- msg += process.Name + "<br />";
- }
- document.write(msg);
- }
- catch(e) {
- }
- </script>
- </body>
- </html>
- <html>
- <body>
- <button onclick="ButtonClick();">设置NTFS文件访问权限</button>
- <script type="text/javascript">
- var SW_HIDE = 0;
- var SW_NORMAL = 1;
- var SW_MINIMIZED = 2;
- var SW_MAXIMIZED = 3;
- var SW_NOACTIVATE = 4;
- var SW_SHOW = 5;
- var SW_MINIMIZE = 6;
- var SW_MINNOACTIVE = 7;
- var SW_SHOWNA = 8;
- var SW_RESTORE = 9;
- var SW_DEFAULT = 10;
- function ButtonClick() {
- var shell = new ActiveXObject("WScript.Shell");
- shell.Run("cmd.exe /c copy c://AUTOEXEC.BAT d://AUTOEXEC.TXT", SW_HIDE, true); // 执行并等待
- shell.Run("cmd.exe /c cacls d://AUTOEXEC.TXT /e /p /"local service/":w", SW_HIDE, true); // 执行并等待
- shell = null;
- }
- </script>
- </body>
- </html>
u