簡體   English   中英

Powershell Invoke-WebRequest 的問題

[英]Problem with Powershell Invoke-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提供的路徑$extractedOutput 確保“C:\\ZipOutput”和“C:\\ExtractedOutput”文件夾存在於您執行此腳本的機器上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM