2017-06-21 30 views
2

私は、SQLのSQLテーブルをループし、Webページ上のタグのそれ以上のURLを収集するpowershellスクリプトを持っています。powershell foreachループが3回目の実行で終了しない

SQLテーブルにわずかなURLしかないのに、foreachループがいくつかの実行後に機能しなくなったようだが、テーブルが大きくなった(ただし約250+行まで)場合はうまくいくように思えますちょうどハングアップし、なぜ私は理解できません。アクティビティは単に停止し、foreachループは決して終了しません。

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server=localhost\SQLEXPRESS;Database=PowerScrape;trusted_connection=true;" 
$SqlConnection.Open() 
$SqlCommand = New-Object System.Data.SQLClient.SQLCommand 
$SqlCommand.Connection = $SqlConnection 

$SqlSelectStatement = ("SELECT URL as url FROM dbo.CapturedURL WHERE NOT LEFT(Url,7) ='mailto:'") 
$SqlCommand.CommandText = $SqlSelectStatement 
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
$SqlAdapter.SelectCommand = $SqlCommand 
$SqlCommand.Connection = $SqlConnection 
$DataSet = New-Object System.Data.DataSet 
$SqlAdapter.Fill($Dataset) 

ForEach ($Row in $Dataset.Tables[0].Rows) 
{ 

    $Request = Invoke-WebRequest -Uri $Row[0] 
    $UrlArray = $Request.Links | Select-Object -ExpandProperty href 
    $UrlAuthority = $Request.BaseResponse | Select-Object -ExpandProperty ResponseUri | Select-Object -ExpandProperty Authority 

    ForEach ($Url in $UrlArray) 
    { 
     If ($Url -like "/*") 
     { 
      $ScrapedUrl = $UrlAuthority+$Url 
     } 

     Else  
     { 
      $ScrapedUrl = $Url 
     } 

     If ($ScrapedUrl -notlike "#*"-and $ScrapedUrl -ne '' -and $ScrapedUrl -ne $null) 
     { 
      $SqlInsertStatement = " 
      BEGIN 
       IF NOT EXISTS (SELECT * FROM CapturedUrl WHERE URL = '"+$ScrapedUrl+"') 
        BEGIN 
         INSERT CapturedURL (URL) VALUES ('"+$ScrapedUrl+"') 
        END 
      END;" 

     $SqlCommand = $SqlConnection.CreateCommand() 
     $SqlCommand.CommandText = $SqlInsertStatement 
     $SqlCommand.ExecuteNonQuery() 
     } 
    } 
} 

は私が例http://rouge.jneen.net(ない私のウェブサイト、私はオフを開始するだけでいくつかのリンクで好きなだけ1)、さらに6つのURLが挿入されているため、私のテーブルに1行を挿入する場合。それから私は再びそれを実行すると、テーブルのすべてのURLに行き、279のURLを挿入します。これは問題ありませんが、3回目に実行するとUri https://github.com/edwardloveall/portfolioのInvoke-WebRequestを呼び出した後にハングアップし、何もしません。

誰かがこれをデバッグする方法や私が間違っているところを指し示してくれますか?

+0

ISEでスクリプトをデバッグしようとしましたか?それは少なくともあなたに指示を与えるべきです。ハングするコマンドのVerboseスイッチを使用すると、それ以降のことが分かります。 – bluuf

+0

ええ、私はそれを繰り返したが、何のエラーも投げなかったが、まだ終了しなかった。デバッグせずに実行すると失敗したURLに来たときには、ステップイン、アウト、またはアウトさせることはできません。 – boomcubist

答えて

0

私は同様の問題を持っていた犯人が呼び出した、それはあなたを食べているいくつか呼び出すをスキップすること呼び出すにタイムアウトを与えるhappened.Soボークまで待たさ

$Request = Invoke-WebRequest -Uri $Row[0] -TimeoutSec 30 

、これを試してみてください時間。

また、私はあなたにワークフローを試して、これを実行することをお勧めしますFor eac Parallel速い実行のために。

+0

あなたの提案をありがとうが、残念ながらそれは動作しませんでした。タイムアウトを2秒に設定しようとしましたが、30分放置してもまだ完了しませんでした。 – boomcubist

+0

さて、ルーキー修正として、デバッガを用意して、foreachループ内で多くの変数を設定し、コードがどこに奇妙なのかを調べようとしてください。私は(もし可能であれば)提案します。ここにサンプルデータを投稿してください正確に何が入っているのか。 –

関連する問題