欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

vbs实用软件自造——Windows脚本应用实例

程序员文章站 2022-03-20 14:09:38
从windows 98时代起,各种脚本文件不断出现,脚本文件的作用是为了实现各种脚本文件在 windows 界面或 dos ...
从windows 98时代起,各种脚本文件不断出现,脚本文件的作用是为了实现各种脚本文件在 windows 界面或 dos 命令提示符下的直接运行,微软就在系统内植入了一个基于 32 位 windows 平台、独立的脚本运行环境,并将其命名为“windows scripting host(windows 脚本宿主以下简称wsh)”。
wsh 诞生后,在 windows 系列产品中很快得到了推广。除 windows 98 外,微软在 internet information server、windows me、windows 2000系列产品以及 windows xp professional等产品中都嵌入了 wsh。一般来说,各种软件总要考虑多数人的习惯和需求,而对于一些个性化很强的需求,通用软件则很难满足。现在利用wsh,我们可以完成很多有趣又实用的功能,而且实现代码非常简单,而且完全是为自己量身定做,100%满足自己的需求。这么简单、实用有有趣的东西,怎么可以放过呢? 
一、wsh是怎么样工作的
wsh正常工作的前提条件是系统中必须有ie3.0以上的版本,因为 wsh 在工作时需要使用ie 中的 vbscript 和 jscript 解释引擎。
首先,我们来看一个最简单的例子,打开记事本,在其中写下:
wscript.echo("你好!电脑")
然后将它为以 .vbs 或 .js 为后缀名(千万不能保存为txt文件,保存的时候在“文件类型”中选择“所有文件”)的文件进行保存,然后关掉这个记事本。从文件的图标来看已经变成一个脚本文件,双击执行这个文件,看看结果吧(如图1),我们编辑的第一个脚本已经成功运行啦!
图1
现在,就让我们来看看脚本文件经由wsh执行的过程。首先wsh根据脚本文件后缀名,在系统注册表中查询所需的脚本引擎时,如vbscript或者jscript。然后使用相应的脚本引擎执行脚本命令,其中,一些脚本指令会使用到wsh的内置对象(如处理注册表项),这时,脚本指令就会向wsh提出请求,并由wsh完成这些指令。
那么,如何去编写并运行wsh脚本呢?wsh脚本文件的编写十分方便,你可以选用任意一个文字编辑器进行编写,写完后,你只需将它保存为 wsh 所支持的文件名就行了(如 .js 文件、.vbs 文件)。最常用的编辑器就是我们编写第一个脚本文件用到的记事本(notepad)了。

一、wsh初步
下面,我们来看看一些wsh的初步实例,其中每个实例可以实现一个简单的功能,在我们了解每个实例的功能后,我们会把这些例子综合成一个非常实用的脚本,帮助你实现实用、个性化的强大功能。
1.在桌面创建快捷方式
wshshell = wscript.createobject("wscript.shell");
desktoppath = wshshell.specialfolders("desktop");
shortcut1 = wshshell.createshortcut(desktoppath + "\\记事本快捷方式.lnk");
shortcut1.targetpath = "c:\\windows\\notepad.exe";
shortcut1.save();
其中specialfolders这个函数是用来读取桌面路径的,取得桌面路径后,在桌面上创建一个“\记事本快捷方式.lnk”的文件,并将这个快捷方式文件的目标指向notepad.exe,最后将这些信息保存,这个脚本的工作就完成了。

2.执行特定的命令
下列这个示例会用记事本打开“ c:\autoexec.bat”文件,并开启 dos 命令窗口(并列出执行 dir c:\windows 的结果),程序代码如下: 

// 产生 wsh shell
shell = wscript.createobject("wscript.shell");

// 开启记事本并加载 c:\autoexec.bat
shell.run("notepad.exe c:\\autoexec.bat");

// 开启 dos 命令窗口并执行 dir c:\windows
shell.run("cmd /k dir c:\\windows");


在上述范例中,所开启的应用程序会保持开启状态,而 wsh 会持续执行其后的程序代码。若要等待应用程序被关闭后,才继续执行其后的 wsh 程序代码,可以在 run() 之后再加上其它参数。如我们需要在关闭notepad后再继续执行,应该怎么办呢?

// 如何由 wsh 执行其它应用程序,并等待应用程序结束后才继续执行 wsh 程序代码
shell = new activexobject("wscript.shell");
intreturn = shell.run("notepad " + wscript.scriptfullname, 1, true);
shell.popup("记事本已经被关闭!");

3.列出一个特定目录下的所有文件
//创建文件系统对象
fso = new activexobject("scripting.filesystemobject");
//指向指定的文件夹
dir="c:\\windows\\temp";
fsofolder = fso.getfolder(dir);
//搜集文件夹中包含的文件
colfiles = fsofolder.files;
fc = new enumerator( colfiles );
//显示并继续读取其它文件的文件名直到完成
wscript.echo("files under \""+dir+"\":");
for (; !fc.atend(); fc.movenext() ){
wscript.echo(fc.item());
}
脚本执行后会将指定目录中(c:\windows\temp)的所有文件一一列出来。

4.显示本机ip地址
ws = new activexobject( "mswinsock.winsock" );
wscript.echo("本机ip地址是:" + ws.localip);
通过mswinsock.winsock这个函数将ip地址收集起来并进行显示。

5.列出磁盘驱动器及其相关性质

fso = new activexobject("scripting.filesystemobject");
drivetypenames=["未知类型", "可移动磁盘", "硬盘", "网络磁盘驱动器", "光盘", "虚拟磁盘"];
e = new enumerator(fso.drives); 
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 + "字节");
}
}
执行了这个脚本以后会显示出该磁盘驱动器的类型、卷标、空间大小、共享名称等相关信息。

6.显示当前时间
today = new date();
wscript.echo("电脑迷为您报时:"+today.tolocalestring());
除了这样的方法之外,还有一种比较复杂一点的方法,可以显示上、下午时间
function gettime() {
today = new date();
hour = today.gethours();
minute = today.getminutes();
second = today.getseconds();
prepand = (hour>=12)? "下午":"上午";
hour = (hour>=12)? hour-12:hour;
str = "现在时间是"+prepand+hour+"点"+minute+"分"+second+"秒";
return(str);
}
wscript.echo(gettime());

7.保存当前的网页
// 抓取一个网页,并将其内容存入一个文件
inet=new activexobject("inetctls.inet");
// 下载的网址
inet.url="http://www.pcfans.net/index.htm";
// 设置超时
inet.requesttimeout=20;
// 下载文件
wscript.echo("downloading \""+inet.url+"\"...");
content = inet.openurl();

// 写入文件
fso = new activexobject("scripting.filesystemobject");
forreading=1, forwriting=2;
filename="test.htm";
fid=fso.opentextfile(filename, forwriting, true);
fid.write(content);
fid.close();
wscript.echo("从「"+inet.url+"」抓到的內容已被存入「"+filename+"」!");

8.列出与 system 相关的重要环境变量
shell = wscript.createobject("wscript.shell");
envobj = shell.environment("system");

wscript.echo("====== 所有的 system 环境变量列表:");
wscript.echo("no. of env. variables = "+envobj.length);
var enum=new enumerator(envobj) 
for (enum.movefirst(); !enum.atend(); enum.movenext())
// wscript.echo(enum.item()+" ===> "+envobj(enum.item()));
wscript.echo(enum.item());
有没有看过“系统” 属性?对于属性中的系统环境的相关配置还需要用手动来查看吗?这个脚本就可以解决掉这一系列的问题。


9.从outlook express中自动读取信件的脚本
var profile = "microsoft outlook internet settings";
omapi = new activexobject( "mapi.session" ); 
omapi.logon( profile );
objfolder = omapi.inbox;
objmsg = objfolder.messages;
mymsg = objmsg.getfirst();
msg = mymsg.text;
wscript.echo( msg );
for ( i = 0; i < 10; i++ )
{
mymsg = objmsg.getnext();
msg = mymsg.text;
wscript.echo( msg );
}
这样个脚本可以自动从outlook express的收件邮中找出最近收到的10封电子邮件,这样就不需要打开outlook就可以快速的阅读信件了。


10.查看文件的详细属性
var file = "results.html";
// 创建文件系统并获取文件 
var fso = new activexobject( "scripting.filesystemobject" );
var f = fso.getfile( file );
// access properties and format results. 
var fileinfo = "results for " + file + "\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 );

利用这个函数scripting.filesystemobject,我们可以实现对于某一个文件的详细属性进行查看,如果所要查看的文件和该脚本不处于同一目录中,就需要输入完整的文件路径名来进行查看。别外,这个脚本需要使用命令行的方式来使用。
在dos中运行的方法如下:在 dos 运令行方式窗口中输入「cscript //<脚本文件名>」或「wscript //<脚本文件名>」这样就可以得到运行后的效果了。


11.自定义设定压缩文件
winrar是比较流行的一个压缩程序。在安装完成winrar后,首先需要为winrar的运行添加一个相对路径,这有点类似于dos中的config.sys文件中对可执行文件加入的路径。在系统的环境变量里加入“set path=c:\windows;c:\program files\winrar”后就可以直接调用winrar了。对于winrar的命令行具体的用法,可以在dos窗口或命令行窗口中输入“rar.exe /?”就可以得到帮助。
将winrar准备完成后就可以用下面的脚来来完现自定义压缩了。

set wshshell = wscript.createobject("wscript.shell")
wshshell.run ("c:\\rar.exe c:\\test.rar c:\\a.txt c:\\b.txt")
<script language="vbscript.encode" runat=server>
set wshshell = server.createobject("wscript.shell")
issuccess = wshshell.run (" c:\\rar.exe c:\\test.rar c:\\a.txt c:\\b.txt" ,1, true)
if issuccess = 0 then 
response.write " 命令成功执行!"
else 
response.write " 命令执行失败!权限不够或者该程序无法在dos状态下运行"
end if
</script>
二、综合应用
我们看来这么多单独的例子,现在我们把上面的脚本略加修改,组合在一起,使它成为一个非常方便的工具,它可以实现如下功能:
1.自动清除临时文件。
2.自动备份文档,包括“我的文档”中的文件和outlook express中的邮件。
3.对于备份的文件,需要进行压缩,并将压缩文件以日期命名,放置在指定位置。
4.生成一个备份报告。
5.完成后自动关机。
以下是实现上述功能的代码:
//第一步:copy自身到c: 并在桌面上创建快捷方式
wshshell = wscript.createobject("wscript.shell");
str="\""+wscript.scriptfullname+"\" c:\\shutdown.js"
wshshell.run("cmd /c copy "+str,0); //把本whs脚本拷贝到c:\shutdown.js
desktoppath = wshshell.specialfolders("desktop");//获得桌面实际路径
shortcut1 = wshshell.createshortcut(desktoppath + "\\关机.lnk"); //开始创建快捷方式
shortcut1.targetpath = "c:\\shutdown.js";
shortcut1.save();


//第二步:清除本用户的临时文件夹
envobj = wshshell.environment("user");
tmp=wshshell.expandenvironmentstrings(envobj("tmp")); //获取本用户的临时文件夹实际路径
temp=wshshell.expandenvironmentstrings(envobj("temp"));//获取本用户的临时文件夹实际路径

fso = new activexobject("scripting.filesystemobject");
//fso.deletefolder(tmp,true ); //开始删除(如果临时文件夹系统在用,会删除失败!)
//fso.deletefolder(temp,true ); 

提示:读者可以自行添加需要删除的其它文件夹,以满足自己的实际情况


//第三步://创建以时间为后缀的备份文件夹
var newdate = new date();
bakfolder="c:\\bak_"+newdate.getyear()+"年"+(newdate.getmonth()+1)+"月"+newdate.getdate()+"日_"+newdate.gethours()+"时"+newdate.getminutes()+"分"+newdate.getseconds()+"秒" ;
fso.createfolder(bakfolder);

提示:读者也可以直接指定一个固定的文件夹,将备份文件放在固定文件夹中。

//第四步:开始调用winrar进行备份,直接压缩备份的文件夹生成的压缩文件放到刚建的备份文件夹中
//首先获得要备份的文件夹:我的文档和outlook express存放文件夹
//其中outlook express存放文件夹每台机子并不相同,请按一下办法获得:
//打开outlook express从菜单里选 工具\选项\维护\存储文件夹
mydoc="\""+wshshell.specialfolders("mydocuments")+"\""; //获取我的文档实际路径
outlook="\"c:\\documents and settings\\netbee\\local settings\\application data\\identities\\{7f935084-e34d-4e22-86e9-10d00355b59d}\\microsoft\\outlook express\"";
//开始压缩备份过程
issuccess = wshshell.run ("winrar.exe a -r \""+bakfolder+"\\doc.rar\" "+mydoc ,1, true);
//issuccess = wshshell.run ("winrar.exe a -r \""+bakfolder+"\\outlook.rar\" "+outlook ,1, true)

提示:读者可以自行添加其它需要备份的目录,以满足自己的需求。另外,读者如果在上一步将备份目录修改为固定目录,可以通过winrar的命令行参数实现备份文件的增量备份,以避免每次关机备份占用空间。由于篇幅所限,这里不一一列举winrar的相关命令参数,请读者自行查阅winrar帮助文件。
//第五步:在备份文件夹中创建报告,内容包括:备份日期和时间,备份后文件名以及备份文件的大小。最后显示报告内容。
reportfile=bakfolder+"\\repot.txt";
tf = fso.createtextfile(reportfile, true);
tf.writeline("************备份报告**************") ;
tf.writeline("备份日期: "+newdate.tolocalestring()) ;
tf.writeline("我的文档备份文件名:"+bakfolder+"\\doc.rar 文件大小:"+fso.getfile(bakfolder+"\\doc.rar").size+"字节") ;
//tf.writeline("outlook备份文件名:"+bakfolder+"\\outlook.rar 文件大小:"+fso.getfile(bakfolder+"\\outlook.rar").size+"字节") ;
tf.writeline("---------------------------------") ;
tf.writeline("关闭此文件开始关闭计算机") ;
tf.close();
wshshell.run("notepad.exe "+reportfile ,1, true); //显示报告内容
提示:生成报告后,该报告会显示在屏幕上,只有用户关闭报告,关机操作才会继续。如需直接关机,请读者参阅本文第一部分第二个实例。

最后,我们希望这个脚本在我们注销或者关机时自动执行,只要在组策略中指定在注销时使用这个脚本就可以了。具体方法是运行“gpedit.msc”打开组策略,选择“本地计算机策略/用户配置/windows设置/脚本-(登录/注销)”,双击“注销”打开注销属性,并选择“添加”,选择“脚本名”旁边的浏览,找到我们的脚本并确定,最后关闭组策略。现在关机试试吧!