我有一个运行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进程。
好吧,它比这更复杂。有一个
[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)