饭祷爱

The quieter you are,the more you are able to hear

导航

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对象

本章有点不和谐,希望别被删,版主留情,周末愉快~

posted on 2012-11-17 18:27  饭祷爱  阅读(1118)  评论(0编辑  收藏  举报