你是否需要從網絡上下載文件,但卻討厭重複點擊鏈接?如果你的工作需要定期從網絡上下載文件,你可能會想自動化這個任務。為什麼不使用PowerShell來下載文件,就像用替代的PowerShell wget一樣呢?
Windows PowerShell和PowerShell都具有文件下載功能。使用PowerShell下載文件只需要知道使用哪些cmdlets和.NET類以及如何使用它們。
在本文中,你將學習使用PowerShell從網絡上下載文件的各種方法。
先決條件
由於這是一篇通過實際操作學習的文章,有一些先決條件要確保你能夠按照示例進行操作。以下是基本要求。
- A computer that is running on Windows 10 or higher. This computer is where you will run the scripts/commands featured in this article.
- Windows PowerShell 5.1或PowerShell 7.1(建議)。
- Windows 10已經包含了Windows PowerShell 5.1。
- A web site that hosts the files to download.
- 對於非驗證文件下載,可以考慮使用免費的Tele2 Speedtest網站。
- 如果你想測試帶有授權的文件下載,可能需要建立你自己的HTTP文件服務器。一個免費的HTTP文件服務器的例子是HFS by Rejetto。
使用PowerShell從URL下載文件的四種方法
有四種方法可以使用PowerShell下載文件,而不依賴於第三方工具。它們是:
Invoke-WebRequest
Invoke-RestMethod
Start-BitsTransfer
- .NET WebClient 類別。
無論您使用這四種方法中的哪一種,使其運作的邏輯和元件都是相同的。必須有指向檔案位置的來源 URL,以及保存下載檔案的目的地路徑。如果網頁伺服器需要,您還需要輸入憑證。
接下來的章節將展示這四種方法中的每一種。最終,您可以決定在使用 PowerShell 下載檔案時適應哪種方式。
使用 Invoke-WebRequest 作為 PowerShell 的 wget 替代品
在 PowerShell 中,第一種下載檔案的方法是使用 Invoke-WebRequest
指令。或許這是本文中最常使用的指令,Invoke-WebRequest 可以下載 HTTP、HTTPS 和 FTP 連結。
無論來源位置是否需要使用者登入,Invoke-WebRequest 指令都可以處理需要憑證的請求。
為了下載檔案,下方的語法顯示了達成所需結果所需的最小參數。
例如,下面的程式碼從網站下載一個名為 10MB.zip 的檔案。然後將下載的檔案保存到 C:\dload\10MB.zip。您可以將下面的程式碼複製並貼到 PowerShell 會話中進行測試。
下面的演示显示了在PowerShell中运行上述代码后的预期结果。如您所见,文件下载成功。

如果源文件需要身份验证才能访问怎么办?例如,下面的代码从一个需要用户登录的私人网站下载文件。
然而,由于未经授权访问,下载失败了。

如果需要身份验证,您应该使用-Credential
参数向请求添加凭据。下面代码的第一行会提示您输入凭据(用户名和密码),并将其存储到$credential
变量中。
下面的演示显示了在PowerShell中运行上述代码时的预期结果。如您所见,Get-Credential
命令提示了一个PowerShell凭据请求。这次,使用凭据和Invoke-WebRequest
进行下载是成功的。

相关链接:使用PowerShell Get-Credential命令和凭据相关的一切
在使用Invoke-WebRequest时要注意解析错误
A crucial thing to remember when using Invoke-WebRequest
in Windows PowerShell is that, by default, this cmdlet uses the Internet Explorer engine to parse data. The error below may happen when using Invoke-WebRequest
on computers without the Internet Explorer in it.
您需要重新发出命令,但这次要包括-UseBasicParsing
开关。
在Windows PowerShell中,您可能会收到一条错误消息:无法解析响应内容,因为Internet Explorer引擎不可用,或者Internet Explorer的首次启动配置尚未完成。请指定UseBasicParsing参数并重试。
从PowerShell Core 6.0开始,Invoke-WebRequest cmdlet仅使用基本解析。因此,-UseBasicParsing参数不再必要。
使用Invoke-RestMethod
Invoke-RestMethod cmdlet更适合向RESTful Web服务发送HTTP或HTTPS请求。此cmdlet更适用于与Microsoft Graph API等REST API交互的请求。
当涉及直接从Web下载文件时,Invoke-RestMethod是一个很好的选择。不要被误导以为有其他不同。在从直接的Web链接下载文件时,使用Invoke-RestMethod和Invoke-WebRequest之间没有太大区别。
使用Invoke-RestMethod下载文件
要使用Invoke-RestMethod下载文件,请使用以下语法。您会注意到该命令使用与Invoke-WebRequest相同的参数。
在下面的示例代码中,文件从$source变量中的URL值下载,然后保存到$destination变量中定义的路径中。
如果源需要身份验证,可以使用-Credential
参数传递凭据。下面的示例提示输入凭据,并将其存储在$credential
变量中。然后将$credential
变量的值传递给-Credential
参数。
另外,由于文件链接是HTTP源而不是HTTPS,这意味着您正在发送未加密的身份验证信息。通常情况下,出于安全考虑,应避免使用HTTP源。但如果必须使用HTTP源,则需要在命令中添加-AllowUnencryptedAuthentication
开关。
使用Start-BitsTransfer
Start-BitsTransfer
专门用于在客户端和服务器计算机之间传输文件。此PowerShell cmdlet依赖于Windows操作系统中的Background Intelligent Transfer Service(BITS)。
由于Start-BitsTransfer
需要BITS才能工作,因此该cmdlet在非Windows计算机上不可用。另一方面,Start-BitsTransfer
本身也享受BITS的好处。其中一些好处包括:
- 网络带宽和使用情况意识。
- 处理中断(恢复、自动恢复、暂停等)
- 作为后台作业下载多个文件。
- 能够设置下载作业的优先级。
下载文件
在PowerShell中使用Start-BitsTransfer
下載文件的基本方法是指定源和目標。使用下面的腳本,您只需要根據您的需求更改$source
和$destination
的值。
從下面的示例中可以看到,文件被下載到路徑c:\dload\100MB.zip。

假設未指定目標,
Start-BitsTransfer
將文件下載並保存到當前工作目錄中。例如,如果您從C:\dload運行Start-BitsTransfer
,則文件將下載到同一目錄。
對於需要身份驗證的下載,Start-BitsTransfer
具有一個-Credential
參數,接受一個PSCredential對象。
下載多個文件
為了演示下載多個文件,您需要創建一個包含兩列的CSV文件。將文件命名為filelist.txt。第一列應包含源的鏈接,而第二列必須包含目標路徑。文件內容如下所示。
相關:使用Import-Csv在PowerShell中管理CSV文件
一旦 CSV 文件准备好,使用下面的命令开始文件下载。该命令使用 Import-Csv
导入 CSV 文件,并将内容传递给 Start-BitsTransfer
。
请参考下面的演示,了解上述代码的工作原理。如您所见,下载开始了,您可以看到下载进度。在下载过程中,PowerShell 提示符不可用。

假设您想将下载过程作为后台作业开始。要这样做,您只需在 Start-BitsTransfer
命令的末尾添加 -Asynchronous
开关。
最初,每个作业的状态将显示为“连接中”。下面的截图显示了每个文件下载的作业 ID。

现在,您已经开始了下载过程,您将想要检查下载是否已完成。要检查下载作业的状态,请使用 Get-BitsTransfer
cmdlet。如下所示,下载作业的状态已更改为“已传输”。

使用 WebClient 类和 HttpClient 类(.NET Framework)
PowerShell 基于 .NET,并且其本质使其能够利用 .NET 本身的功能。在 PowerShell 中,有两个 .NET 类可用于下载文件:WebClient 和 HttpClient。
如果您想以更多的開發和技術方式了解這兩個.NET類別,您可以從→ 何時使用WebClient vs. HttpClient vs. HttpWebRequest開始。在下一節中,您將學習如何在PowerShell中使用WebClient和HttpClient下載網路上的文件。
使用System.Net.WebClient下載文件
要使用WebClient類別,您需要將一個物件初始化為System.Net.WebClient
型別。在下面的例子中,$webClient
是新的System.Net.WebClient
物件。然後,使用DownloadFile()
方法開始從來源下載文件。
相關文章:使用PowerShell資料類型加速器加快編碼速度
請將下面的程式碼複製並在您的PowerShell會話中運行以進行測試。請注意,除非出現錯誤,否則您將不會在屏幕上看到任何進度或輸出。但是,在下載完成之前,PowerShell提示將被鎖定。
如果源文件需要身份验证才能允许下载,您可以使用以下代码。第一行提示输入凭据,并将其存储到$credentials
变量中。然后,在文件下载请求中包含$credential
的值。
根据这个Microsoft文档:“我们不建议您在新开发中使用WebClient类。相反,请使用System.Net.Http.HttpClient类。”
看起来WebClient类已经过时,Microsoft推荐的新类是HttpClient类。不过,不用担心。下一节将介绍如何在PowerShell中使用HttpClient类来下载网上的文件。
使用System.Net.Http.HttpClient下载文件
和WebClient类一样,您需要首先创建System.Net.Http.HttpClient
。使用下面的代码将文件从$source
下载到$destination
。请参考每行代码上面的注释了解每行代码的功能。
以下的程式碼是動態的,您可以在 PowerShell 會話中運行它以進行測試。
在需要身份驗證的情況下下載檔案,您需要將憑證添加到 HttpClient 物件中。要將憑證包含到檔案下載請求中,請創建一個新的System.Net.Http.HttpClientHandler
物件來存儲憑證。
您可以複製下面的程式碼並在 PowerShell 中運行以進行測試。或者您也可以將其作為 PowerShell 腳本運行。在此示例中,程式碼保存為download-file.ps1。
以下演示了運行 PowerShell 腳本下載文件的結果。
開始時,目錄中只有腳本文件。會提示輸入用戶名和密碼。然後,腳本開始下載文件。下載完成後,可以看到新文件已經位於目的地目錄中。

結論
Windows PowerShell 和 PowerShell Core 具有內置的功能,可以下載文件,作為 PowerShell wget 的替代方案!無論是下載受密碼保護的源代碼,還是單個或多個文件,PowerShell 都為您提供了解決方案。
本文介紹的文件下載方法適用於 Windows PowerShell 和 PowerShell Core。這意味著這些方法適用於 Windows 和非 Windows 系統,但不包括 Start-BitsTransfer
。
由於 PowerShell 不僅僅是一個命令提示符,您可以將所學的知識轉化為腳本。這對您來說意味著自動化的機會。不再需要複製 URL、點擊鏈接並手動等待下載。
Source:
https://adamtheautomator.com/powershell-download-file/