在Powershell脚本中处理COM对象。

问题描述 投票:1回答:1

我有一个运行Powershell脚本的计划任务。这个Powershell脚本发送一个HTTP请求并搜索返回的HTML。作为这个脚本的结果,我留下了一堆没有关闭的dllhost进程。如果我的理解没错的话,这是COM对象的结果。

唯一与COM对象有关的变量就是这个。

$specifiedDiv = $request.ParsedHtml.Body.getElementsByTagName('div') |
    Where-Object{$_.getAttributeNode('class').Value -eq 'results'}

当我运行 $specifiedDiv.GetType()我得到的结果是这样的,我的问题是如何关闭这个对象或者防止脚本创建dllhost进程?

IsPublic IsSerial Name                                     BaseType                                                                                                                                                              
-------- -------- ----                                     --------                                                                                                                                                              
True     False    __ComObject                              System.MarshalByRefObject 

我的问题是,我怎样才能关闭这个对象 或者阻止脚本创建dllhost进程?

编辑:我尝试了上面的方法,但我还是得到了dllhost进程。

    Function garbageCollect ([object]$ref){

            ([System.Runtime.Interopservices.Marshal]::ReleaseComObject([System.__ComObject]$ref) -gt 0)
            [System.GC]::Collect()
            [System.GC]::WaitForPendingFinalizers()
        }
$parsedHtml = $request.ParsedHtml
$body = $parsedHtml.Body
$divs = $body.getElementsByTagName('div')


$classAttribute = $divs | Where-Object{$_.getAttributeNode('class').Value -eq 'results-found'}

        Remove-Variable -Name classAttribute
        Remove-Variable -Name parsedHtml
        Remove-Variable -Name body
        Remove-Variable -Name divs

        garbageCollect($parsedHtml)
        garbageCollect($body)

        foreach($div in $divs)
        {
            garbageCollect($div)
        }
        foreach($thing in $classAttribute)
        {
            garbageCollect($div)
        }

我尝试了上面的方法,但我还是得到了dllhost进程。

powershell com httprequest dllhost
1个回答
1
投票

好吧,它比这更复杂。有一个

[System.InteropServices.Marshal]::ReleaseComobject($specifiedDiv)

这可能会奏效......然而,.NET处理COM对象的方式,你可能会在所有的地方创建一堆中间COM对象。比如$request,$request.ParsedHtml,$request.ParsedHtml.Body。然后,在调用$_.getAttributeNode('class')的过程中,可能还会有一大堆其他COM对象被创建。

$parsedHtml = $request.ParsedHtml
$body = $parsedHtml.Body
$divs = $body.getElementsByTagName('div')

foreach ($div in $divs)
{
   $attrNode = $div.getAttributeNode('class')

   if ($attrNode.Value -eq 'results')
   {
      $specificDiv = $attrNode
      break
   }
   else
   {
      [System.Runtime.Interopservices.Marshal]::ReleaseComObject($div)
   }
}

[System.Runtime.Interopservices.Marshal]::ReleaseComObject($divs)
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($body)
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($parsedHtml)
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($request)
### what is this ??? [System.Runtime.Interopservices.Marshal]::ReleaseComObject($requestHome)


#### Do something with $specificDiv if you want...however, you might create more COM objects...


[System.Runtime.Interopservices.Marshal]::ReleaseComObject($specifiedDiv)
© www.soinside.com 2019 - 2024. All rights reserved.