Loops Powershell foreach循环不是';t第三次执行时退出
我有一个powershell脚本,它循环遍历URL的SQL表,并收集网页上标记中的任何其他URL 当SQL表中只有几个URL时,它似乎工作得很好,但foreach循环在运行了几次之后似乎停止工作,并且表已经增长(但只有大约250多行),之后它就挂起了,我不知道为什么。活动只是停止,foreach循环永远不会退出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
$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循环中设置大量变量,并尝试找出代码的奇怪之处。我建议(如果可能)将示例数据发布在此处,所以我们知道里面到底发生了什么。