首页 > 解决方案 > Powershell Invoke-WebRequest 的问题

问题描述


当我尝试执行命令时

 Invoke-WebRequest -Uri example.com/zip.zip -OutFile C:\SomePath\zip.zip

PowerShell 只是想了几秒钟然后退出,PowerShell 窗口就消失了。但是当我输入just时Invoke-WebRequest,它会要求我输入参数,但是当我一个一个输入参数时效果是一样的。

标签: powershellinvoke-webrequest

解决方案


为了下载文件,Invoke-WebRequest这不是最佳方式,因为 HTTP 响应流被缓冲到内存中,并且一旦文件被完全加载,那么只有它会被刷新到磁盘。在大文件的情况下,这可能会导致性能影响。

我建议您使用System.Net.WebClientDotNET 类从您的 GitHub 源下载文件。您可以将代码重构为如下所示:

$url = "http://github.com/zip.zip"
$output = "C:\SomePath\zip.zip"
(New-Object System.Net.WebClient).DownloadFile($url, $output)

这个 cmdlet 比 Invoke-WebRequest 好在哪里?你可能会问。

使用 System.Net.WebClient,速度/性能得到很大提高,因为 HTTP 响应流在整个下载过程中直接缓冲到磁盘(而不是将工作拆分为 fetch-and-flush 任务)。

注意:确保本地输出文件(您在 $output 中为其提供路径)是有效文件并且存在,否则在使用 DownloadFile 方法时可能会出现错误。

更新:

由于上述解决方案在压缩文件的情况下似乎无法按预期工作,因此这里有另一种可用于使用 PowerShell 实现此目的的解决方法:

$url = "http://github.com/zip.zip" 
$zipOutput = "C:\ZipOutput\" + $(Split-Path -Path $url -Leaf) 
$extractedOutput = "C:\ExtractedOutput\"
(New-Object System.Net.WebClient).DownloadFile($url, $zipOutput)
$shellObj = New-Object -ComObject Shell.Application 
$files = $shellObj.Namespace($zipOutput).Items() 
$shellObj.NameSpace($extractedOutput).CopyHere($files) 
Start-Process $extractedOutput

zip 文件将下载到中提供的路径$zipOutput,脚本将进一步提取内容并将提取的内容存储在中提供的路径中$extractedOutput。确保执行此脚本的计算机上存在“C:\ZipOutput”和“C:\ExtractedOutput”文件夹。


推荐阅读