Powershell foreach循环不会在第三次执行时退出

问题描述:

我有一个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

试试这个,

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

我有一个类似的问题,罪魁祸首是调用,它一直在等待,直到调用happened.So给超时到所调用跳过一些是吃了你所调用时间。

另外我建议你尝试工作流程,并使用For eac Parallel来加快执行速度。

+0

感谢您的建议,但不幸的是它没有奏效。我尝试将超时设置为2秒,并将其保留半小时,但仍未完成。 – boomcubist

+0

好吧,作为一个新手修复尝试有一个调试器,并设置foreach循环内的很多变量,并试图找出究竟代码变得怪异的地方。我会建议(如果可能)在这里发布示例数据,所以我们理解究竟是怎么回事? –