0

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
2
  • 1
    Looks like you are running out of resources, try putting $ie = New-Object -COMObject InternetExplorer.Application before the foreach loop. Commented Jan 12, 2015 at 18:18
  • 1
    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. Commented Jan 13, 2015 at 8:18

2 Answers 2

2

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()
Sign up to request clarification or add additional context in comments.

Comments

1

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.