Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Powershell foreach循环不是';t第三次执行时退出_Loops_Powershell_Foreach - Fatal编程技术网

Loops Powershell foreach循环不是';t第三次执行时退出

Loops Powershell foreach循环不是';t第三次执行时退出,loops,powershell,foreach,Loops,Powershell,Foreach,我有一个powershell脚本,它循环遍历URL的SQL表,并收集网页上标记中的任何其他URL 当SQL表中只有几个URL时,它似乎工作得很好,但foreach循环在运行了几次之后似乎停止工作,并且表已经增长(但只有大约250多行),之后它就挂起了,我不知道为什么。活动只是停止,foreach循环永远不会退出 $SqlConnection = New-Object System.Data.SqlClient.SqlConnection $SqlConnection.ConnectionStri

我有一个powershell脚本,它循环遍历URL的SQL表,并收集网页上标记中的任何其他URL

当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()
        }
    }
}
例如,当我在我的表中插入一行时(不是我的网站,只是我喜欢的一行,开头只有几个链接),会再插入六个URL。然后,当我再次运行它时,它会转到表中的所有URL并插入279个URL。这很好,但当我第三次运行它时,它在调用Uri上的Invoke WebRequest后挂起,不做任何其他事情

有人能告诉我如何调试这个程序或者我哪里出了问题吗

试试这个

$Request = Invoke-WebRequest -Uri $Row[0] -TimeoutSec 30
我有一个类似的问题,罪魁祸首是调用,它一直等到调用发生。所以给调用一个超时,跳过一些正在占用您时间的调用


另外,我建议您尝试工作流,并使用以加快执行速度。

您是否尝试在ISE中调试脚本?这至少应该给你一个指示。在挂起的命令中使用Verbose开关应该会告诉你更多。是的,我做了,它迭代了,没有抛出任何错误,但仍然没有退出。当URL在没有调试的情况下运行失败时,它不会让我跳过、进入或退出。谢谢你的建议,但不幸的是它没有工作。我尝试将超时设置为2秒,并将其保留了半个小时,但仍然没有完成。好的,作为新手,尝试使用调试器,在foreach循环中设置大量变量,并尝试找出代码的奇怪之处。我建议(如果可能)将示例数据发布在此处,所以我们知道里面到底发生了什么。