Yogesh
Yogesh

Reputation: 129

Error while running Powershell script New-Object : Retrieving the COM class factory

After help from some of SO esteemed members I reached to the point where I can run below code. But it happens that this script runs out in middle. The ERROR I get is pasted at last.

TILL NOW : I re-started my system number of times just to make sure it isn't some system problem but no luck.

Please note I added following three lines in code, again to make sure that it is something because of some IE.

**# try few things 
$result = $null
$ie.quit
get-process iexplore | stop-process**

CODE STARTS HERE :

 $controls   = Get-Content ("d:\users\yarora\desktop\hkd1000.txt")
    Add-Type -AssemblyName 'System.Web'

    Function getStringMatch
    {


       Foreach ($control In $controls)
        {
         $ie = New-Object -COMObject InternetExplorer.Application


    #for testing purpose
    $control

    #encode the special characters in URL like %,& etc.

    $controlUri = [System.Web.HttpUtility]::UrlEncode($control)
    $site = $ie.Navigate("https://www.xxxy.com/search/all?name=$controlUri")

    #$ie.ReadyState

        while ($ie.Busy){ sleep -Milliseconds 100 }

            $link = $null
            $link = $ie.Document.get_links() | where-object {if ($_.innerText){$_.innerText.contains($control)}}
            $link.click()

        while ($ie.Busy){ sleep -Milliseconds 100 }

    [regex]$regex = 
    @'
    (?s).+?<A href="/generics/.*?">(.*?)</A>
    '@

    $result = $regex.Matches($ie.Document.body.outerHTML) |
    foreach {
              [PSCustomObject]@{
              Name = $control
              Saltname = $_.Groups[1].value 
             }


    }

    $result | out-file d:\result.txt -append 

    # try few things 
    $result = $null
    $ie.quit
    get-process iexplore | stop-process

    }
    }
    getStringMatch

ERROR

New-Object : Retrieving the COM class factory for component with CLSID {0002DF01-0000-0000-C000-000000000046} failed due to the following error: 800706bf The remote procedure call failed and did not execute. (Exception from HRESULT: 0x800706BF). At D:\script.ps1:22 char:12 + $ie = New-Object -COMObject InternetExplorer.Application + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ResourceUnavailable: (:) [New-Object], COMException + FullyQualifiedErrorId : NoCOMClassIdentified,Microsoft.PowerShell.Commands.NewObjectCommand

UPDATE As per suggestion from Micky, I placed -COMobject out of Foreach loop. But the script still errors out after few loops :

You cannot call a method on a null-valued expression.
At D:\desktop\hkdforsalt1000.ps1:41 char:9
+         $link.click()
+         ~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Upvotes: 0

Views: 5161

Answers (2)

Micky Balladelli
Micky Balladelli

Reputation: 10001

That means that $link is $null. So either there is an error in the value stored in $control, or that specific product name is no longer available. You should check for the value of $link prior to invoking its click() method and performing all the actions after that, since they are all based on the assumption that the link was clicked.

Upvotes: 1

Jan Chrbolka
Jan Chrbolka

Reputation: 4454

This should probably be a comment, but I do not have enough points to comment. Basically what Micky said… Create your $ie object only once and reuse it inside the loop like this:

Function getStringMatc {
    $controls   = Get-Content ("d:\users\yarora\desktop\hkdforsalt1000.txt")
    $ie = New-Object -COMObject InternetExplorer.Application

    Foreach ($control In $controls){
        $controlUri = [System.Web.HttpUtility]::UrlEncode($control)
        $site = $ie.Navigate("https://www.healthkartplus.com/search/all?name=$controlUri")
        #rest of your code here...
    }
    # more code here...

    $ie.quit()
}

NOTE: $ie.Quit() is a function so it needs empty brackets.

Also, you can trigger a garbage collection at the end of your script to dispose of unused objects:

[System.GC]::Collect()

Upvotes: 2

Related Questions