2017-06-21 96 views
2

我有一個powershell腳本,它循環訪問URL的SQL表並收集網頁上標記中的任何其他URL。Powershell foreach循環不會在第三次執行時退出

當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(不是我的網站,只是一個我只有幾個環節要開始關閉)另外六個網址插入。然後,當我再次運行它時,它將跳轉到表中的所有URL並插入279個URL。這很好,但是當我第三次運行它時,它在調用Uri https://github.com/edwardloveall/portfolio上的Invoke-WebRequest之後掛起,並且不執行任何操作。

有人可以請我指出如何調試這個方向或我要去哪裏錯了。

+0

您是否嘗試在ISE中調試腳本?這應該至少給你一個指示。在掛起的命令中使用Verbose開關應該在這之後告訴你更多。 – bluuf

+0

是的,我做了,它迭代並沒有拋出任何錯誤,但仍然沒有退出。當涉及到未經調試而運行失敗的URL時,它不會讓我跨越,進入或退出。 – boomcubist

回答

0

試試這個,

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

我有一個類似的問題,罪魁禍首是調用,它一直在等待,直到調用happened.So給超時到所調用跳過一些是吃了你所調用時間。

另外我建議你嘗試工作流程,並使用For eac Parallel來加快執行速度。

+0

感謝您的建議,但不幸的是它沒有奏效。我嘗試將超時設置爲2秒,並將其保留半小時,但仍未完成。 – boomcubist

+0

好吧,作爲一個新手修復嘗試有一個調試器,並設置foreach循環內的很多變量,並試圖找出究竟代碼變得怪異的地方。我會建議(如果可能)在這裏發佈示例數據,所以我們理解究竟是怎麼回事? –