Powershell Invoke-WebRequest 问题
Problem with Powershell Invoke-WebRequest
当我尝试执行命令时
Invoke-WebRequest -Uri example.com/zip.zip -OutFile C:\SomePath\zip.zip
PowerShell 只是想了几秒钟然后退出,PowerShell window 正在消失。
但是当我只输入Invoke-WebRequest
时,它要求我输入参数,但是当我一个一个输入参数时效果是一样的。
为了下载文件,Invoke-WebRequest
不是最佳方式,因为 HTTP 响应流被缓冲到内存中,一旦文件已完全加载 - 那么只有它会被刷新到磁盘。如果文件很大,这可能会影响性能。
我建议您使用 System.Net.WebClient
DotNET class 从 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,speed/performance 得到了很大改进,因为 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' 文件夹存在于您执行此脚本的计算机上。
当我尝试执行命令时
Invoke-WebRequest -Uri example.com/zip.zip -OutFile C:\SomePath\zip.zip
PowerShell 只是想了几秒钟然后退出,PowerShell window 正在消失。
但是当我只输入Invoke-WebRequest
时,它要求我输入参数,但是当我一个一个输入参数时效果是一样的。
为了下载文件,Invoke-WebRequest
不是最佳方式,因为 HTTP 响应流被缓冲到内存中,一旦文件已完全加载 - 那么只有它会被刷新到磁盘。如果文件很大,这可能会影响性能。
我建议您使用 System.Net.WebClient
DotNET class 从 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,speed/performance 得到了很大改进,因为 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' 文件夹存在于您执行此脚本的计算机上。