Powershell调用WebRequest的问题

问题描述


当我尝试执行命令时

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

PowerShell会思考几秒钟,然后退出,PowerShell窗口将消失。 但是,当我仅输入Invoke-WebRequest时,它会问我一些参数,但是当我一一输入参数时效果是一样的。

解决方法

要下载文件,Invoke-WebRequest并不是最理想的方法,因为HTTP响应流被缓冲到内存中,并且一旦文件被完全加载,则仅将其刷新到磁盘上。如果文件很大,这可能会影响性能。

我建议您使用System.Net.WebClient DotNET类从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响应流在整个下载过程中直接缓冲到磁盘上(并且不会将工作拆分为提取和刷新任务),因此速度/性能得到了很大改善。

注意:请确保本地输出文件(在$ 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”文件夹。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...