0

问题:我正在制作一个 PowerShell 脚本,它将下载站点源代码,找到所有文件目标,然后下载所述目标。我暂时可以进行身份​​验证,所以在我的测试网站上,我启用了匿名身份验证,启用了目录浏览,并禁用了所有其他默认页面,所以我得到的只是我网站上的文件列表。我到目前为止是这样的:

$source = "http://testsite/testfolder/"
$webclient = New-Object system.net.webclient
$destination = "c:/users/administrator/desktop/test/"
$webclient.downloadstring($source)

它将基本上返回我网站的$webclient.downloadstring源代码,我可以看到我想要包含在其余代码中的文件。我对你们的问题是隔离我想要的链接的最佳和/或最简单的方法是什么,以便我可以执行 foreach 命令来下载所有链接?

另外,为了获得额外的信用,我将如何添加代码以从我的站点下载文件夹和这些文件夹中的文件?我至少可以制作单独的脚本来从每个子文件夹中提取文件,但显然将它们全部放在一个脚本中会更好。

4

1 回答 1

0

如果您使用的是 PowerShell v3,则Invoke-WebRequestcmdlet 可能会有所帮助。

要获取代表网站的对象:

Invoke-WebRequest "http://stackoverflow.com/search?tab=newest&q=powershell"

要获取该网站中的所有链接:

Invoke-WebRequest "http://stackoverflow.com/search?tab=newest&q=powershell" | select -ExpandProperty Links

并获取href元素列表:

Invoke-WebRequest "http://stackoverflow.com/search?tab=newest&q=powershell" | select -ExpandProperty Links | select href

如果您使用的是 PowerShell v2 或更早版本,则必须创建一个InternetExplorer.ApplicationCOM 对象并使用它来导航页面:

$ie = new-object -com "InternetExplorer.Application"
# sleep for a second while IE launches
Start-Sleep -Seconds 1
$ie.Navigate("http://stackoverflow.com/search?tab=newest&q=powershell")
# sleep for a second while IE opens the page
Start-Sleep -Seconds 1
$ie.Document.Links | select IHTMLAnchorElement_href
# quit IE
$ie.Application.Quit()

感谢这篇博文,我从中了解到Invoke-WebRequest.

更新:也可以像您发布的那样下载网站源,然后从源中提取链接。像这样的东西:

$webclient.downloadstring($source) -split "<a\s+" | %{ [void]($_ -match "^href=[`'`"]([^`'`">\s]*)"); $matches[1] }

-split部分沿以 开头的行拆分源,<a后跟一个或多个空格。输出被放置在一个数组中,然后我通过一个foreach-object块进行管道传输。在这里,我匹配正则表达式中的每一行,它提取链接部分并输出它。

如果您想对输出做更多的事情,您可以将它进一步通过另一个对其进行处理的块。

于 2013-10-21T08:06:15.590 回答