如何改进或优化 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
过滤器抽取大量对象。
我有这个 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
过滤器抽取大量对象。