Invoke-WebRequest
从 Internet 上的网页中获取内容。
语法
Default (默认值)
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>]
说明
Invoke-WebRequest
cmdlet 向网页或 Web 服务发送 HTTP、HTTPS、FTP 和 FILE 请求。 它分析响应并返回表单、链接、图像和其他重要 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 属性类似于“* 值”的窗体字段。 筛选后的结果通过管道传递给 Select-Object
,用来选择 Name 和 Value 属性。
示例 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 后, 变量中 Web 响应对象的 $R
属性指示用户已成功登录。
示例 3:从网页获取链接
此命令获取网页中的链接。
(Invoke-WebRequest -Uri "https://devblogs.microsoft.com/powershell/").Links.Href
Invoke-WebRequest
cmdlet 获取网页内容。 然后,返回的 HtmlWebResponseObject 的 Links 属性用于显示每个链接的 Href 属性。
示例 4:从 Invoke-WebRequest 捕获非成功消息
当 Invoke-WebRequest
遇到非成功 HTTP 消息(404、500 等),它将不返回任何输出并引发终止错误。 若要捕获错误并查看 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:同时下载多个文件
Invoke-WebRequest
cmdlet 一次只能下载一个文件。 以下示例使用 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
}
注释
若要使用 Start-ThreadJob
cmdlet,必须从 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 |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | True |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-Certificate
指定用于安全 Web 请求的客户端证书。 输入包含证书的变量或获取证书的命令或表达式。
若要查找证书,请使用 Get-PfxCertificate
或使用 Certificate (Get-ChildItem
) 驱动器中的 Cert:
cmdlet。 如果证书无效或没有足够的颁发机构,命令将失败。
参数属性
类型: | X509Certificate |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-CertificateThumbprint
指定有权发送请求的用户帐户的数字公钥证书(X509)。 输入证书的证书指纹。
证书用于基于客户端证书的身份验证。 证书只能映射到本地用户帐户,而不能映射到域帐户。
若要查看证书指纹,请使用 Get-Item
或 Get-ChildItem
命令在 Cert:\CurrentUser\My
中找到证书。
参数属性
类型: | String |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-ContentType
指定 Web 请求的内容类型。
如果 ContentType 的值包含编码格式(如 charset
),则 cmdlet 使用该格式对 Web 请求的正文进行编码。 如果 ContentType 未指定编码格式,则改用默认编码格式。 一种具有编码格式的 ContentType 的示例是 text/plain; charset=iso-8859-5
,它指定了 拉丁文/西里尔文 字母表。
如果省略参数,则内容类型可能因使用的 HTTP 方法而异:
- 对于 POST 方法,内容类型
application/x-www-form-urlencoded
- 对于 PUT 方法,内容类型
application/json
- 对于其他方法,在请求中未指定内容类型
如果使用 InFile 参数上传文件,则应设置内容类型。
通常,类型应 application/octet-stream
。 但是,需要根据终结点的要求设置内容类型。
参数属性
类型: | String |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-Credential
指定有权发送请求的用户帐户。 默认值为当前用户。
键入用户名(如 User01 或 Domain01\User01),或输入由 cmdlet 生成的 Get-Credential
对象。
凭据存储在 PSCredential 对象中,密码存储为 SecureString。
注释
有关 SecureString 数据保护的详细信息,请参阅 SecureString 的安全性如何?。
参数属性
类型: | PSCredential |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-DisableKeepAlive
指示 cmdlet 将 HTTP 标头中的 KeepAlive 值设置为 False。 默认情况下,KeepAlive 为 true true。 KeepAlive 建立与服务器的持久连接,以促进后续请求。
参数属性
类型: | SwitchParameter |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-Headers
指定 Web 请求的标头。 输入哈希表或字典。
若要设置 UserAgent 标头,请使用 UserAgent 参数。 不能使用此参数来指定 UserAgent 或 cookie 标头。
参数属性
类型: | IDictionary |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-InFile
从文件获取 Web 请求正文的内容。 输入路径和文件名。 如果省略路径,则默认值为当前位置。
还需要设置请求的内容类型。 例如,若要上传文件,应设置内容类型。 通常,类型应 application/octet-stream
。 但是,需要根据终结点的要求设置内容类型。
参数属性
类型: | String |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-MaximumRedirection
指定在连接失败之前,PowerShell 将连接重定向到备用统一资源标识符(URI)的次数。 默认值为 5。 值为 0(零)会阻止所有重定向。
参数属性
类型: | Int32 |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-Method
指定用于 Web 请求的方法。 此参数的可接受值为:
Default
Delete
Get
Head
Merge
Options
Patch
Post
Put
Trace
参数属性
类型: | WebRequestMethod |
默认值: | None |
接受的值: | Default, Get, Head, Post, Put, Delete, Trace, Options, Merge, Patch |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-OutFile
指定此 cmdlet 保存响应正文的输出文件。 输入路径和文件名。 如果省略路径,则默认值为当前位置。
默认情况下,Invoke-WebRequest
将结果返回到管道。 若要将结果发送到文件和管道,请使用 PassThru 参数。
参数属性
类型: | String |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-PassThru
指示该 cmdlet 除了将结果写入文件外,还会返回结果。 仅当命令中也使用 OutFile 参数时,此参数才有效。
注释
使用 PassThru 参数时,输出将写入管道,但文件为空。 有关详细信息,请参阅 PowerShell 问题 #15409。
参数属性
类型: | SwitchParameter |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-Proxy
指定请求的代理服务器,而不是直接连接到 Internet 资源。 输入网络代理服务器的 URI。
参数属性
类型: | Uri |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-ProxyCredential
指定有权使用由 Proxy 参数指定的代理服务器的用户帐户。 默认值为当前用户。
键入用户名(如 User01
或 Domain01\User01
),或输入 PSCredential 对象,例如由 Get-Credential
cmdlet 生成的用户名。
仅当命令中也使用 Proxy 参数时,此参数才有效。 不能在同一命令中使用 ProxyCredential 和 ProxyUseDefaultCredentials 参数。
参数属性
类型: | PSCredential |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-ProxyUseDefaultCredentials
指示 cmdlet 使用当前用户的凭据访问由 Proxy 参数指定的代理服务器。
仅当命令中也使用 Proxy 参数时,此参数才有效。 不能在同一命令中使用 ProxyCredential 和 ProxyUseDefaultCredentials 参数。
参数属性
类型: | SwitchParameter |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | 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 |
默认值: | None |
支持通配符: | False |
不显示: | False |
别名: | SV |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-TimeoutSec
指定请求在超时之前可以等待多长时间。以秒为单位输入值。 默认值为0,指定无限期超时。
域名系统(DNS)查询最多可能需要 15 秒才能返回或超时。如果请求包含需要解析的主机名,并且将 TimeoutSec 设置为大于零的值,但小于 15 秒,则引发 WebException 前可能需要 15 秒或更短的时间,并且请求超时。
参数属性
类型: | Int32 |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-TransferEncoding
指定传输编码 HTTP 响应标头的值。 此参数的可接受值为:
Chunked
Compress
Deflate
GZip
Identity
参数属性
类型: | String |
默认值: | None |
接受的值: | chunked, compress, deflate, gzip, identity |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-Uri
指定 Web 请求发送到的 Internet 资源的统一资源标识符(URI)。 输入 URI。 此参数支持 HTTP、HTTPS、FTP 和 FILE 值。
此参数是必需的。 参数名称 Uri 是可选的。
参数属性
类型: | Uri |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | 0 |
必需: | True |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-UseBasicParsing
指示该 cmdlet 在不使用文档对象模型(DOM)分析的情况下对 HTML 内容使用响应对象。 如果未在计算机上安装 Internet Explorer,例如在 Windows Server 操作系统的服务器核心安装上,则需要此参数。
参数属性
类型: | SwitchParameter |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-UseDefaultCredentials
指示 cmdlet 使用当前用户的凭据发送 Web 请求。
参数属性
类型: | SwitchParameter |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-UserAgent
指定 Web 请求的用户代理字符串。 默认用户代理类似于 Mozilla/5.0 (Windows NT; Windows NT 6.1; en-US) WindowsPowerShell/3.0
,每个操作系统和平台都有细微的变化。
若要使用大多数 Internet 浏览器使用的标准用户代理字符串测试网站,请使用 PSUserAgent 类的属性,例如 Chrome、Firefox、InternetExplorer、Opera 和 Safari。 例如,以下命令使用了用于 Internet Explorer 的用户代理字符串:Invoke-WebRequest -Uri https://website.com/ -UserAgent ([Microsoft.PowerShell.Commands.PSUserAgent]::InternetExplorer)
参数属性
类型: | String |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
-WebSession
指定 Web 请求会话。 输入变量名称,包括美元符号($
)。
若要替代 Web 请求会话中的值,请使用 cmdlet 参数,例如 UserAgent 或 Credential。 参数值优先于 Web 请求会话中的值。
与远程会话不同,Web 请求会话不是永久性连接。 它是一个对象,其中包含有关连接和请求的信息,包括 Cookie、凭据、最大重定向值和用户代理字符串。 可以使用它在 Web 请求之间共享状态和数据。
若要创建 Web 请求会话,请在 命令的 Invoke-WebRequest
参数的值中输入变量名称(不含美元符号)。
Invoke-WebRequest
创建会话并将其保存在变量中。 在后续命令中,使用变量作为 WebSession 参数的值。
不能在同一命令中使用 SessionVariable 和 WebSession 参数。
参数属性
类型: | WebRequestSession |
默认值: | None |
支持通配符: | False |
不显示: | False |
参数集
(All)
Position: | Named |
必需: | False |
来自管道的值: | False |
来自管道的值(按属性名称): | False |
来自剩余参数的值: | False |
CommonParameters
此 cmdlet 支持通用参数:-Debug、-ErrorAction、-ErrorVariable、-InformationAction、-InformationVariable、-OutBuffer、-OutVariable、-PipelineVariable、-ProgressAction、-Verbose、-WarningAction 和 -WarningVariable。 有关详细信息,请参阅 about_CommonParameters。
输入
Object
可以通过管道将 Web 请求的正文传递给此 cmdlet。
输出
HtmlWebResponseObject
此 cmdlet 会返回表示 Web 请求结果的响应对象。
备注
Windows PowerShell 为 Invoke-WebRequest
提供以下别名:
iwr