如何改进或优化 Powershell 中的特定 Invoke-WebRequest?

How to improve or optimize a particular Invoke-WebRequest in Powershell?

我有这个 Powershell 命令:

((Invoke-WebRequest https://www.intel.com/content/www/us/en/download/19344/intel-graphics-windows-10-windows-11-dch-drivers.html).AllElements | Where-Object -Property TagName -eq "META" | where -Property name -eq RecommendedDownloadUrl).content

我知道这可能会做得更好,这是一个具体的问题,但我想我可以从您的回答中学到很多东西。 我只想从 META 标签中获取推荐的 URL,以便从 intel 的网站下载最新的图形驱动程序。

我 运行 一轮改进,将 Where-Object 减少到只有一个命令:

((Invoke-WebRequest https://www.intel.com/content/www/us/en/download/19344/intel-graphics-windows-10-windows-11-dch-drivers.html).AllElements | Where-Object {$_.TagName -eq "META" -and $_.name -eq "RecommendedDownloadUrl"}).content

谢谢!

可能是最好的方法 - 但如果你想优化速度,你可以使用 -UseBasicParsing 开关来防止 PowerShell 旋转起来一个 Internet Explorer 的无头实例来解析 html(这就是它慢的原因):

$content = Invoke-WebRequest 'https://www.intel.com/content/www/us/en/download/19344/intel-graphics-windows-10-windows-11-dch-drivers.html' -UseBasicParsing |% Content

现在我们在变量中有一些原始 html - 现在我们只需要手动解析相关元标记中的 link:

if($content -match '<meta\ name="RecommendedDownloadUrl"\ content="([^"]+)'){
  # grab link from capture group
  $Matches[1]
}

我不认为这比您当前的解决方案“更好”的原因是,如果英特尔对 HTML 进行更改而不会影响 DOM,您的脚本可能会中断- 如果他们突然改变周围属性的顺序,它将不再起作用

您至少可以 return 只有与您想要的名称相匹配的元素:

(Invoke-WebRequest https://www.intel.com/content/www/us/en/download/19344/intel-graphics-windows-10-windows-11-dch-drivers.html).ParsedHtml.getElementsByName('RecommendedDownloadUrl')

如果您可以不指定它是 META,您可以只获取该结果并获取其中的内容:

$((Invoke-WebRequest https://www.intel.com/content/www/us/en/download/19344/intel-graphics-windows-10-windows-11-dch-drivers.html).ParsedHtml.getElementsByName('RecommendedDownloadUrl')).content

假设他们只有一个名为 RecommendedDownloadUrl 的元素应该可以正常工作。它仍然解析页面,所以它可能不会快很多,但它使用对象的固有方法而不是通过 Where-Object 过滤器抽取大量对象。