关于Windows系统脚本(jscript)

最近想做个简单的小工具用于自动改文件名,奈何windows原生shell太过鸡肋,只好用vbs,但是实在无法理解vb中很多语法规则,加之异常水土不服的代码风格,只好转而写jscript了,开始不愿用jscript也是因为微软api文档残缺。。。谁让jscript不是windows亲儿子,其大部分功能都是靠ActiveXObject实现的,相对的vbs就简单多了如提示框msgbox函数即可,如果只是为了弹这个框推荐vbs。

下面给出各个重要对象的创建方法,具体方法和属性在msdn上有相关文档。注意文档有点坑,文档写的是属性可能在jscript中是方法,或者相反,因为他是针对vbs写的文档。。。

下面列出的对象我也写了一些封装的对象,操作比直接用方便得多。

jscript文件系统对象:

WScript.CreateObject("Scripting.FileSystemObject");

读写文件操作目录必须的对象

Regexp对象的使用和javascript完全一样

只是windows对正则的高级特性支持不太理想如/(?<=windows)2000/反向预查不支持/(?<name>dance)/命名分组不支持,基本和ie9对正则的支持是一致的

jscript Excel对象

相关属性方法太多请自行查阅msdn

WScript.CreateObject("Application.Excel");

jscript WShell对象

WScript.CreateObject("WScript.Shell");

此对象的popup方法可实现弹出对话框等功能。windows jscript alert方法(为了方便大家检索)。

jscript InternetExplore对象

WScript.CreateObject("InternetExplorer.Application");

此对象可获得ie浏览器对象可编写自动访问某些站点的脚本,通过document属性操作页面和javascript完全一样

对此我自己实现了一个Jscript版的css选择器,支持不是很完善但比手动查找dom元素方便n倍

支持类名,id,tagname,属性选择器

对于元素继承关系支持后代选择和>选择器

Finder需要传入从internetExplorer对象获取的document

下面是代码

function Finder(docu){
	//将document与对象关联
	this.docu=docu;
	this.indexOf=function(arr,n){
		for(var i=0;i<arr.length;i++){
			if(arr[i]===n){
				return i;
			}
		}
		return -1;
	}
	this.concatArray=function(arr,a2){
		if(this.indexOf(arr,a2)!=-1){
			return;
		}
		for(var i=0;i<a2.length;i++){
			arr[arr.length]=a2[i];
		}
	}
	//可实现id,class,tagName,属性选择器过滤
	//过滤器顺序标签名,id,类名,属性
	this.filter=function(arr,data){
		var tmp=[];
		//用于属性选择器和class选择器跳出while内层循环
		a:
		for(var i=0;i<arr.length;i++){
			var n=arr[i];
			var hasFilter=false;
			if(data.name){
				hasFilter=true;
				if(n.tagName.toLowerCase()!=data.name.toLowerCase()){
					continue;
				}
			}
			if(data.id){
				hasFilter=true;
				if(n.id!=data.id.replace("#","")){
					continue;
				}
			}
			if(data.className){
				hasFilter=true;
				var nodeClass=n.className;
				var classes=(data.className+"").split(".");
				//确保className每个类名前后都有空字符
				for(var j=0;j<classes;j++){
					var clas=classes[i];
					clas=clas.trim();
					clas=" "+clas+" ";
					if(!nodeClass.match(clas)){
						continue a;
					}
				}
			}
			if(data.attr){
				hasFilter=true;
				/**
				属性名		1
				属性值		2
				*/
				//用于获取属性名和值
				var attrReg=/^\[([^=\]]+)(?:=([^\]]+))?\]/;
				//用于去除字符串中的引号
				var trimReg=/(^\"|\"$)/g;
				var attrStr=data.attr;
				while(attrStr!=""){
					var m=attrStr.match(attrReg);
					attrStr=attrStr.replace(attrReg,"");
					m={name:m[1],value:m[2]};
					var name=m["name"];
					name=name.replace(trimReg,"");
					var value=m["value"];
					var realValue=n.getAttribute(name);
					if(value){
						value=value.replace(trimReg,"");
						if(realValue!=value){
							continue a;
						}
					}else{
						if(realValue==null){
							continue a;
						}
					}
				}
			}
			//由于所有过滤方式都是可选的所以必须检查是否使用了过滤方式如果没有则报错
			if(!hasFilter){
				throw "选择器语法错误";
			}
			tmp.push(n);
		}
		return tmp;
	}
	this.parseData=function(str){
		var a=str.match(this.selectorReg);
		if(a==null){
			throw "选择器语法错误";
		}
		return {childType:a[1],name:a[2],id:a[3],className:a[4],attr:a[5]}
	};
	//传入的context必须是document或者页面元素
	//此方法只负责实现子节点兄弟节点查找过滤由filter方法实现
	//查找只能从body开始向下,如传入body则无法查找到任何匹配
	this.find=function(selector,context){
		selector=selector.replace(/\s{2,}/g," ");
		if(selector.match(/^[^\w\d >#\.\[]/)){
			throw "选择器语法错误";
		}
		if(selector.match(/^[^\s>]/)){
			selector=" "+selector;
		}
		context=context?context:this.docu;
		if(context.nodeType!=1){
			var testId=/^\s*#([\w\d\-_]+)\s*$/;
			var m=selector.match(testId);
			if(m!=null){
				return [context.getElementById(m[1])];
			}else{
				context=context.body;
			}
		}
		var data=this.parseData(selector);
		var waitValid=[];
		if(data.childType==">"){
			waitValid=context.children;
			waitValid=this.filter(waitValid,data);
		}else if(data.id||data.attr){
			function getAllChildren(node,call,that,data){
				var selfChildren=node.children;
				for(var i=0;i<selfChildren.length;i++){
					var c=selfChildren[i];
					call(c,that,data);
					getAllChildren(c,call,that,data);
				}
			}
			getAllChildren(context,function(n,that,data){
				waitValid.push(n);
			},this,data);
			waitValid=this.filter(waitValid,data);
		}else{
			if(data.name){
				waitValid=context.getElementsByTagName(data.name);
			}else if(data.className){
				var cls=" "+cls;
				cls=data.className.split(".")[1];
				waitValid=context.getElementsByClassName(cls);
			}
			waitValid=this.filter(waitValid,data);
		}
		selector=selector.replace(this.selectorReg,"");
		if(selector!=""){
			//如果选择器没有执行完则以前面的查找结果继续向下查找
			//前面的查询结果直接丢弃
			var tmp=[];
			for(var i=0;i<waitValid.length;i++){
				var ite=waitValid[i];
				var t=this.find(selector,ite);
				this.concatArray(tmp,t);
			}
			return tmp;
		}
		return waitValid;
	}
}
//用于解析选择器不能使用命名分组功能
//子节点类型	1
//tagName		2
//id选择器		3
//类名选择器	4
//属性选择器	5
Finder.prototype.selectorReg=/^([ >])([\-_\w\d]+)?(#[\w\d\-_])?((?:\.[\-_\w\d]+)*)((?:\[[^\]]+\])*)/;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值