问题描述
当我尝试执行命令时
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”文件夹。