Invoke-WebRequest
從因特網上的網頁取得內容。
語法
Invoke-WebRequest
[-UseBasicParsing]
[-Uri] <Uri>
[-WebSession <WebRequestSession>]
[-SessionVariable <String>]
[-Credential <PSCredential>]
[-UseDefaultCredentials]
[-CertificateThumbprint <String>]
[-Certificate <X509Certificate>]
[-UserAgent <String>]
[-DisableKeepAlive]
[-TimeoutSec <Int32>]
[-Headers <IDictionary>]
[-MaximumRedirection <Int32>]
[-Method <WebRequestMethod>]
[-Proxy <Uri>]
[-ProxyCredential <PSCredential>]
[-ProxyUseDefaultCredentials]
[-Body <Object>]
[-ContentType <String>]
[-TransferEncoding <String>]
[-InFile <String>]
[-OutFile <String>]
[-PassThru]
[<CommonParameters>]
Description
Cmdlet 會將 Invoke-WebRequest
HTTP、HTTPS、FTP 和 FILE 要求傳送至網頁或 Web 服務。 它會剖析回應,並傳回窗體、連結、影像和其他重要 HTML 元素的集合。
此 Cmdlet 已在 Windows PowerShell 3.0 中引進。
注意
根據預設,網頁中的腳本程式代碼可能會在剖析頁面以填入 ParsedHtml
屬性時執行。 -UseBasicParsing
使用 參數來隱藏此專案。
重要
本文中的範例參考網域中的 contoso.com
主機。 這是Microsoft用於範例的虛構網域。 這些範例的設計目的是要示範如何使用 Cmdlet。
不過,由於 contoso.com
網站不存在,因此範例無法運作。 將範例調整為環境中的主機。
範例
範例 1:傳送 Web 要求
此範例會 Invoke-WebRequest
使用 Cmdlet 將 Web 要求傳送至 Bing.com 網站。
$Response = Invoke-WebRequest -UseBasicParsing -URI https://www.bing.com?q=how+many+feet+in+a+mile
$Response.InputFields |
Where-Object name -like "* Value" |
Select-Object name, value
name value
---- -----
From Value 1
To Value 5280
傳 Invoke-WebRequest
回的數據會儲存在變數中 $Response
。 回應 的 InputFields 屬性包含表單域。 Where-Object
是用來將表單域篩選為 name 屬性類似 「* Value」 的表單字段。 篩選的結果會透過管道傳送至 以Select-Object
選取名稱和值屬性。
範例 2:使用具狀態 Web 服務
此範例示範如何使用 Invoke-WebRequest
Cmdlet 搭配具狀態 Web 服務,例如 Facebook。
$R = Invoke-WebRequest https://www.facebook.com/login.php -SessionVariable fb
# This command stores the first form in the Forms property of the $R variable in the $Form variable.
$Form = $R.Forms[0]
# This command shows the fields available in the Form.
$Form.fields
Key Value
--- -----
...
email
pass
...
# These commands populate the username and password of the respective Form fields.
$Form.Fields["email"]="User01@Fabrikam.com"
$Form.Fields["pass"]="P@ssw0rd"
# This command creates the Uri that will be used to log in to facebook.
# The value of the Uri parameter is the value of the Action property of the form.
$Uri = "https://www.facebook.com" + $Form.Action
# Now the Invoke-WebRequest cmdlet is used to sign into the Facebook web service.
# The WebRequestSession object in the $FB variable is passed as the value of the WebSession parameter.
# The value of the Body parameter is the hash table in the Fields property of the form.
# The value of the *Method* parameter is POST. The command saves the output in the $R variable.
$R = Invoke-WebRequest -Uri $Uri -WebSession $FB -Method POST -Body $Form.Fields
$R.StatusDescription
第一個命令會 Invoke-WebRequest
使用 Cmdlet 來傳送登入要求。 此命令會指定 SessionVariable 參數值的 「FB」 值,並將結果儲存在變數中$R
。 當命令完成時, $R
變數會 包含 HtmlWebResponseObject ,而 $FB
變數包含 WebRequestSession 物件。
Invoke-WebRequest
Cmdlet 登入 facebook 之後,變數中 $R
Web 回應物件的 StatusDescription 屬性表示使用者已成功登入。
範例 3:從網頁取得連結
此命令會取得網頁中的連結。
(Invoke-WebRequest -Uri "https://devblogs.microsoft.com/powershell/").Links.Href
Cmdlet Invoke-WebRequest
會取得網頁內容。 然後會使用所傳回 HtmlWebResponseObject 的 Links 屬性來顯示每個連結的 Href 屬性。
範例 4:從 Invoke-WebRequest 攔截非成功訊息
當遇到非成功 HTTP 訊息(404、500 等)時 Invoke-WebRequest
,它不會傳回任何輸出並擲回終止錯誤。 若要攔截錯誤並檢視 StatusCode ,您可以將執行封入區塊中 try/catch
。
try
{
$Response = Invoke-WebRequest -Uri "www.microsoft.com/unkownhost"
# This will only execute if the Invoke-WebRequest is successful.
$StatusCode = $Response.StatusCode
}
catch
{
$StatusCode = $_.Exception.Response.StatusCode.value__
}
$StatusCode
404
區塊會攔截catch
終止錯誤,該區塊會從 Exception 物件擷取 StatusCode。
範例 8:同時下載多個檔案
Cmdlet Invoke-WebRequest
一次只能下載一個檔案。 下列範例會使用 Start-ThreadJob
建立多個線程作業,同時下載多個檔案。
$baseUri = 'https://github.com/PowerShell/PowerShell/releases/download'
$files = @(
@{
Uri = "$baseUri/v7.3.0-preview.5/PowerShell-7.3.0-preview.5-win-x64.msi"
OutFile = 'PowerShell-7.3.0-preview.5-win-x64.msi'
},
@{
Uri = "$baseUri/v7.3.0-preview.5/PowerShell-7.3.0-preview.5-win-x64.zip"
OutFile = 'PowerShell-7.3.0-preview.5-win-x64.zip'
},
@{
Uri = "$baseUri/v7.2.5/PowerShell-7.2.5-win-x64.msi"
OutFile = 'PowerShell-7.2.5-win-x64.msi'
},
@{
Uri = "$baseUri/v7.2.5/PowerShell-7.2.5-win-x64.zip"
OutFile = 'PowerShell-7.2.5-win-x64.zip'
}
)
$jobs = @()
foreach ($file in $files) {
$jobs += Start-ThreadJob -Name $file.OutFile -ScriptBlock {
$params = $using:file
Invoke-WebRequest @params
}
}
Write-Host "Downloads started..."
Wait-Job -Job $jobs
foreach ($job in $jobs) {
Receive-Job -Job $job
}
注意
若要使用 Cmdlet,Start-ThreadJob
您必須從 PowerShell 資源庫 安裝 ThreadJob 模組。
參數
-Body
指定要求的主體。 本文是遵循標頭的要求內容。
您也可以使用管線將主體值傳送至 Invoke-WebRequest
。
Body 參數可用來指定查詢參數的清單,或指定回應的內容。
當輸入是 GET 要求,主體是 IDictionary (通常是哈希表),主體會新增至 URI 作為查詢參數。 對於其他要求類型(例如 POST),本文會設定為標準 name=value
格式的要求本文值。
當本文是窗體,或它是呼叫的 Invoke-WebRequest
輸出時,PowerShell 會將要求內容設定為表單域。
例如:
$r = Invoke-WebRequest https://website.com/login.aspx
$r.Forms\[0\].Name = "MyName"
$r.Forms\[0\].Password = "MyPassword"
Invoke-RestMethod https://website.com/service.aspx -Body $r
- 或-
Invoke-RestMethod https://website.com/service.aspx -Body $r.Forms\[0\]
類型: | Object |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | True |
接受萬用字元: | False |
-Certificate
指定用於安全 Web 要求的客戶端憑證。 輸入包含憑證的變數,或取得憑證的命令或表達式。
若要尋找憑證,請使用 Get-PfxCertificate
或使用 Get-ChildItem
Certificate (Cert:
) 磁碟驅動器中的 Cmdlet。 如果憑證無效或沒有足夠的授權單位,則命令會失敗。
類型: | X509Certificate |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-CertificateThumbprint
指定有權傳送要求之用戶帳戶的數位公鑰憑證 (X509)。 輸入憑證的憑證指紋。
憑證將用於用戶端憑證式驗證。 憑證只能對應至本機用戶帳戶,而不是網域帳戶。
若要查看憑證指紋,請使用 Get-Item
或 Get-ChildItem
命令在 中 Cert:\CurrentUser\My
尋找憑證。
類型: | String |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-ContentType
指定 Web 要求的內容類型。
如果省略此參數,且要求方法為 POST, Invoke-WebRequest
請將內容類型設定為 application/x-www-form-urlencoded
。 否則,不會在呼叫中指定內容類型。
類型: | String |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-Credential
指定有權傳送要求的用戶帳戶。 預設為目前使用者。
輸入用戶名稱,例如User01或Domain01\User01,或輸入 Cmdlet 所產生的 Get-Credential
PSCredential 物件。
認證會儲存在 PSCredential 物件中,密碼會儲存為 SecureString。
注意
如需 SecureString 數據保護的詳細資訊,請參閱 SecureString 有多安全?。
類型: | PSCredential |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-DisableKeepAlive
指出 Cmdlet 會將 HTTP 標頭中的 KeepAlive 值設定為 False。 根據預設, KeepAlive 為 True。 KeepAlive 會建立與伺服器的持續性連線,以利後續的要求。
類型: | SwitchParameter |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-Headers
指定 Web 要求的標頭。 輸入哈希表或字典。
若要設定 UserAgent 標頭,請使用 UserAgent 參數。 您無法使用此參數來指定 UserAgent 或 Cookie 標頭。
類型: | IDictionary |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-InFile
從檔案取得 Web 要求的內容。
輸入路徑和檔名。 如果您省略路徑,則預設值為目前的位置。
類型: | String |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-MaximumRedirection
指定 PowerShell 在連線失敗之前,將連線重新導向至替代統一資源識別碼 (URI) 的次數。 預設值是 5。 值為 0 (零) 會防止所有重新導向。
類型: | Int32 |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-Method
指定用於 Web 要求的方法。 此參數可接受的值為:
Default
Delete
Get
Head
Merge
Options
Patch
Post
Put
Trace
類型: | WebRequestMethod |
接受的值: | Default, Get, Head, Post, Put, Delete, Trace, Options, Merge, Patch |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-OutFile
指定此 Cmdlet 儲存回應本文的輸出檔案。 輸入路徑和檔名。 如果您省略路徑,則預設值為目前的位置。
根據預設, Invoke-WebRequest
會將結果傳回至管線。 若要將結果傳送至檔案和管線,請使用 PassThru 參數。
類型: | String |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-PassThru
指出 Cmdlet 除了將結果寫入檔案之外,也會傳回結果。 只有在命令中也使用 OutFile 參數時,此參數才有效。
注意
當您使用 PassThru 參數時,輸出會寫入管線,但檔案是空的。 如需詳細資訊,請參閱 PowerShell 問題 #15409。
類型: | SwitchParameter |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-Proxy
指定要求的 Proxy 伺服器,而不是直接連線到因特網資源。 輸入網路 Proxy 伺服器的 URI。
類型: | Uri |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-ProxyCredential
指定有權使用 Proxy 參數所指定 Proxy 伺服器的用戶帳戶。 預設為目前使用者。
輸入使用者名稱,例如 User01
或 Domain01\User01
,或輸入 PSCredential 物件,例如 Cmdlet 所產生的 Get-Credential
用戶名稱。
只有在命令中也使用 Proxy 參數時,這個參數才有效。 您無法在 相同的命令中使用 ProxyCredential 和 ProxyUseDefaultCredentials 參數。
類型: | PSCredential |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-ProxyUseDefaultCredentials
指出 Cmdlet 會使用目前使用者的認證來存取 Proxy 參數所 指定的 Proxy 伺服器。
只有在命令中也使用 Proxy 參數時,這個參數才有效。 您無法在 相同的命令中使用 ProxyCredential 和 ProxyUseDefaultCredentials 參數。
類型: | SwitchParameter |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-SessionVariable
指定此 Cmdlet 建立 Web 要求工作階段並將它儲存在值的變數。
輸入不含貨幣符號 ($
) 符號的變數名稱。
當您指定會話變數時, Invoke-WebRequest
會建立 Web 要求會話物件,並將它指派給 PowerShell 會話中具有指定名稱的變數。 只要命令完成,您就可以在會話中使用 變數。
不同於遠端會話,Web 要求會話不是持續性連線。 它是物件,其中包含連線和要求的相關信息,包括 Cookie、認證、最大重新導向值,以及使用者代理程式字串。 您可以使用它,在 Web 要求之間共享狀態和數據。
若要在後續 Web 要求中使用 Web 要求工作階段,請在 WebSession 參數的值中指定會話變數。 PowerShell 會在建立新的連線時,使用 Web 要求工作階段物件中的數據。 若要覆寫 Web 要求會話中的值,請使用 Cmdlet 參數,例如 UserAgent 或 Credential。 參數值優先於 Web 要求工作階段中的值。
您無法在 相同的命令中使用 SessionVariable 和 WebSession 參數。
類型: | String |
別名: | SV |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-TimeoutSec
指定要求逾時之前可以擱置的時間長度。以秒為單位輸入值。 預設值 0 會指定無限期逾時。
功能變數名稱系統 (DNS) 查詢最多可能需要 15 秒才能傳回或逾時。如果您的要求包含需要解析的主機名,而且您將 TimeoutSec 設定為大於零的值,但小於 15 秒,則擲回 WebException 之前可能需要 15 秒以上的時間,而且您的要求逾時。
類型: | Int32 |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-TransferEncoding
指定傳輸編碼 HTTP 回應標頭的值。 此參數可接受的值為:
Chunked
Compress
Deflate
GZip
Identity
類型: | String |
接受的值: | chunked, compress, deflate, gzip, identity |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-Uri
指定傳送 Web 要求之因特網資源的統一資源識別碼 (URI)。 輸入 URI。 此參數支援 HTTP、HTTPS、FTP 和 FILE 值。
此為必要參數。 參數名稱 Uri 是選擇性的。
類型: | Uri |
Position: | 0 |
預設值: | None |
必要: | True |
接受管線輸入: | False |
接受萬用字元: | False |
-UseBasicParsing
指出 Cmdlet 會針對沒有檔案物件模型 (DOM) 剖析的 HTML 內容使用回應物件。 當計算機上未安裝 Internet Explorer 時,需要此參數,例如在 Windows Server 操作系統的 Server Core 安裝上。
類型: | SwitchParameter |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-UseDefaultCredentials
指出 Cmdlet 會使用目前使用者的認證來傳送 Web 要求。
類型: | SwitchParameter |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-UserAgent
指定 Web 要求的使用者代理程式字串。 默認使用者代理程式類似於 Mozilla/5.0 (Windows NT; Windows NT 6.1; en-US) WindowsPowerShell/3.0
每個作業系統和平臺的輕微變化。
若要使用大部分因特網瀏覽器所使用的標準使用者代理程式字串來測試網站,請使用 PSUserAgent 類別的屬性,例如 Chrome、FireFox、InternetExplorer、Opera 和 Safari。 例如,下列命令使用 Internet Explorer 的使用者代理程式字串: Invoke-WebRequest -Uri https://website.com/ -UserAgent ([Microsoft.PowerShell.Commands.PSUserAgent]::InternetExplorer)
類型: | String |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
-WebSession
指定 Web 要求工作階段。 輸入變數名稱,包括貨幣符號 ($
)。
若要覆寫 Web 要求會話中的值,請使用 Cmdlet 參數,例如 UserAgent 或 Credential。 參數值優先於 Web 要求工作階段中的值。
不同於遠端會話,Web 要求會話不是持續性連線。 它是物件,其中包含連線和要求的相關信息,包括 Cookie、認證、最大重新導向值,以及使用者代理程式字串。 您可以使用它,在 Web 要求之間共享狀態和數據。
若要建立 Web 要求工作階段,請在命令的 SessionVariable 參數值中輸入不含貨幣符號的 Invoke-WebRequest
變數名稱。 Invoke-WebRequest
會建立會話,並將它儲存在變數中。 在後續的命令中,使用變數作為 WebSession 參數的值。
您無法在 相同的命令中使用 SessionVariable 和 WebSession 參數。
類型: | WebRequestSession |
Position: | Named |
預設值: | None |
必要: | False |
接受管線輸入: | False |
接受萬用字元: | False |
輸入
您可以使用管線將 Web 要求的本文傳送至此 Cmdlet。
輸出
此 Cmdlet 會傳回代表 Web 要求結果的響應物件。
備註
Windows PowerShell 包含下列的 Invoke-WebRequest
別名:
iwr