【发布时间】:2017-11-24 10:39:34
【问题描述】:
我有一个 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()
}
}
}
当我在我的表中插入一行时,例如http://rouge.jneen.net(不是我的网站,只是我喜欢的一个,只有几个链接开始),另外六个 URL 被插入。然后当我再次运行它时,它会转到表中的所有 URL 并插入 279 个 URL。这很好,但是当我第三次运行它时,它在 Uri https://github.com/edwardloveall/portfolio 上调用 Invoke-WebRequest 后挂起并且不执行任何其他操作。
有人可以指点我如何调试它或我哪里出错了。
【问题讨论】:
-
您是否尝试在 ISE 中调试您的脚本?这至少应该给你一个指示。在挂起的命令中使用 Verbose 开关应该会在此之后告诉您更多信息。
-
是的,我做到了,它迭代并没有抛出任何错误,但仍然没有退出。当涉及到它在没有调试的情况下运行失败的 URL 时,它不会让我跨步,进入或退出。
标签: loops powershell foreach