我有一個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之後掛起,並且不執行任何操作。
有人可以請我指出如何調試這個方向或我要去哪裏錯了。
您是否嘗試在ISE中調試腳本?這應該至少給你一個指示。在掛起的命令中使用Verbose開關應該在這之後告訴你更多。 – bluuf
是的,我做了,它迭代並沒有拋出任何錯誤,但仍然沒有退出。當涉及到未經調試而運行失敗的URL時,它不會讓我跨越,進入或退出。 – boomcubist