powershell初探(八)
这章说说powershell与com对象的交互。我其实并不了解com的细节,只是大概知道这是以前微软使用的组件模型,存在dll hell,需要注册,等等。
当然,如果你十分了解com的编程机理,可能会对ps与com对象的交互更加明了。不过这不是这章的重点,这里我将继续用一个小例子说明ps与com的交互。
先说说这个小例子需要完成的任务:作为一个屌丝,AV自然是必不可少的,不过我是一个有追求的屌丝,只看一些自己喜欢但资源可能比较少的老师的作品。但是我没有1024(话说我也不知道1024到底是什么)所以无法在caoliu这个站点搜片,所以我决定用ps与com来实现ie的自动化来根据关键字搜索。
既然是对象,那么第一步当然是实例化。ps中创建一个ie对象的方法如下:
$ie=New-Object -com internetexplorer.application $ie.visible=$true
上面把$ie这个对象的visible属性设为$true,因为默认的创建的ie对象是不可见的。如果一切顺利你可以看见一个一直处于连接状态的ie,如下图:
当然,visible这个属性是微软编写ie时提供给我们,并不是所有的com对象都会有visible这个属性,要查看一个com对象的可用方法,属性和事件我们可以在创建对象用|gm这个管道命令查看,代码如下:
$ie|gm
以下是$ie提供的一些属性方法等
Name MemberType Definition ---- ---------- ---------- ClientToWindow Method void ClientToWindow (int, int) ExecWB Method void ExecWB (OLECMDID, OLECMDEXECOPT, Variant, Variant) GetProperty Method Variant GetProperty (string) GoBack Method void GoBack () GoForward Method void GoForward () GoHome Method void GoHome () GoSearch Method void GoSearch () Navigate Method void Navigate (string, Variant, Variant, Variant, Variant) Navigate2 Method void Navigate2 (Variant, Variant, Variant, Variant, Variant) PutProperty Method void PutProperty (string, Variant) QueryStatusWB Method OLECMDF QueryStatusWB (OLECMDID) Quit Method void Quit () Refresh Method void Refresh () Refresh2 Method void Refresh2 (Variant) ShowBrowserBar Method void ShowBrowserBar (Variant, Variant, Variant) Stop Method void Stop () AddressBar Property bool AddressBar () {get} {set} Application Property IDispatch Application () {get} Busy Property bool Busy () {get} Container Property IDispatch Container () {get} Document Property IDispatch Document () {get} FullName Property string FullName () {get} FullScreen Property bool FullScreen () {get} {set} Height Property int Height () {get} {set} HWND Property int64 HWND () {get} Left Property int Left () {get} {set} LocationName Property string LocationName () {get} LocationURL Property string LocationURL () {get} MenuBar Property bool MenuBar () {get} {set} Name Property string Name () {get} Offline Property bool Offline () {get} {set} Parent Property IDispatch Parent () {get} Path Property string Path () {get} ReadyState Property tagREADYSTATE ReadyState () {get} RegisterAsBrowser Property bool RegisterAsBrowser () {get} {set} RegisterAsDropTarget Property bool RegisterAsDropTarget () {get} {set} Resizable Property bool Resizable () {get} {set} Silent Property bool Silent () {get} {set} StatusBar Property bool StatusBar () {get} {set} StatusText Property string StatusText () {get} {set} TheaterMode Property bool TheaterMode () {get} {set} ToolBar Property int ToolBar () {get} {set} Top Property int Top () {get} {set} TopLevelContainer Property bool TopLevelContainer () {get} Type Property string Type () {get} Visible Property bool Visible () {get} {set} Width Property int Width () {get} {set}
不同版本的ie可能会略有不同。下面我们得找到caoliu的地址,然后通过ps让$ie这个对象自动获取每一页的信息,并且通过我们设定的关键字进行查找。出与和谐的目的,我把caoliu的网址打上了码
http://184.***********************.php?fid=2&search=&page=2
可以看到page就是一个request.querystring参数,不断改变它就好了。下面是完整的代码:
#创建一个ie对象 $ie=New-Object -com internetexplorer.application #定义一个搜索的关键字。饭岛老师,懂的,不过繁体可能更好 $sKeyword="饭岛" #可见不可见都行 $ie.visible=$true #你要搜索的最大页数 $iPageCount=525 for($i=1;$i -lt $iPageCount;$i++) { #开始访问页面,$i来递增页面 $ie.navigate("http://184.154.128.246/thread0806.php?fid=2&search=&page=$i") #当ie在忙碌的时候,进程停500毫秒,要不没法获取页面的 while($ie.busy) { sleep -milliseconds 500 } #获取$ie的页面内容 $html=$ie.document.documentElement.innerhtml if($html.contains($sKeyword)) { #如果命中关键字,输出文件 将new-item的输出传给$null,否则会将会输出文件创建信息到控制台。输出的文件在ps脚本所在的文件夹下 New-Item -Path "$i.html" -ItemType file -Value $html >>$null } } #退出ie $ie.quit()
这里有个问题,怎么能知道系统中可用的com对象有多少呢?我的办法是看注册表,在HKEYCR节点下的字节点如果包含一个CLSID的字节点就可以创建相应的com对象,而对象的名字就是该节点的名字,如图:刚才创建的ie对象
本章有点不和谐,希望别被删,版主留情,周末愉快~