使用 Invoke-WebRequest (最推荐)
这是 PowerShell 中最现代、最强大、最推荐的方法,它不仅能获取源代码,还能将网页内容解析成结构化的对象,方便后续处理。

(图片来源网络,侵删)
基本用法
# 1. 最简单的用法,直接获取网页内容 # $response 是一个包含所有响应信息的对象 $response = Invoke-WebRequest -Uri "https://www.bing.com" # 2. 获取并显示纯HTML源代码 # .Content 属性包含了网页的完整HTML源代码 $htmlContent = $response.Content $htmlContent
常用参数和属性
Invoke-WebRequest 返回一个 WebResponseObject 对象,它包含了很多有用的属性:
Content: 获取网页的原始HTML内容(字符串)。StatusCode: 获取HTTP状态码,200(成功),404(未找到)。Headers: 获取响应头信息。Links: 一个包含页面所有链接 (<a>) 的对象数组,非常方便。Images: 一个包含页面所有图片 (<img>) 的对象数组。InputFields: 一个包含页面所有输入框 (<input>,<select>,<textarea>) 的对象数组。Forms: 一个包含页面所有表单 (<form>) 的对象数组。
示例:获取页面上的所有链接
$response = Invoke-WebRequest -Uri "https://www.github.com"
# 遍历并显示所有链接的文本和地址
foreach ($link in $response.Links) {
Write-Host "文本: $($link.innerText), 地址: $($link.href)"
}
示例:处理需要登录的网站
很多网站会检查 User-Agent (用户代理) 字段,最好手动设置一个。

(图片来源网络,侵删)
# 设置自定义的 User-Agent
$headers = @{
"User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
# 发送请求,并带上自定义的头部
$response = Invoke-WebRequest -Uri "https://www.example.com" -Headers $headers
# 获取源代码
$htmlContent = $response.Content
$htmlContent
使用 Invoke-RestMethod
这个方法和方法一非常相似,但有一个关键区别:当返回的内容是 JSON 格式时,Invoke-RestMethod 会自动将其解析为 PowerShell 对象(如哈希表或数组),如果目标是获取 HTML,它和方法一基本一样。
基本用法
# 获取HTML源代码,效果和方法一类似 $response = Invoke-RestMethod -Uri "https://www.bing.com" $htmlContent = $response $htmlContent
主要用途:获取 JSON 数据
这才是 Invoke-RestMethod 大显身手的地方。
# 这是一个返回JSON数据的API $jsonUri = "https://api.github.com/users/microsoft" # Invoke-RestMethod 会自动将JSON转换为PowerShell对象 $userInfo = Invoke-RestMethod -Uri $jsonUri # 现在可以直接像操作对象一样访问数据 Write-Host "用户名: " + $userInfo.login Write-Host "公开仓库数: " + $userInfo.public_repos Write-Host "个人主页: " + $userInfo.blog
使用 .NET 类 (底层方法)
这种方法不依赖于 PowerShell 的 cmdlet,而是直接调用 .NET 框架中的 System.Net.HttpWebRequest 或 System.Net.Http.HttpClient 类,它更底层,灵活性更高,但代码也更复杂。
使用 System.Net.Http.HttpClient (推荐在 .NET 方法中使用)
这是 .NET 中处理 HTTP 请求的现代标准。

(图片来源网络,侵删)
# 1. 创建 HttpClient 实例
$client = [System.Net.Http.HttpClient]::new()
# 2. (可选) 设置 User-Agent
$client.DefaultRequestHeaders.Add('User-Agent', 'My-PowerShell-Script/1.0')
# 3. 发送 GET 请求并获取响应流
# 使用 .EnsureSuccessStatusCode() 来检查HTTP状态码,如果不是2xx会抛出异常
$response = $client.GetAsync('https://www.bing.com').Result
$response.EnsureSuccessStatusCode()
# 4. 从响应流中读取内容为字符串
$htmlContent = $response.Content.ReadAsStringAsync().Result
# 5. 显示源代码
$htmlContent
# 6. 释放资源 (重要!)
$client.Dispose()
使用旧版 Invoke-WebRequest (别名 iwr)
在 PowerShell 3.0 之前,获取网页的命令是 Invoke-WebRequest 的一个别名 iwr,虽然现在仍然可用,但返回的对象结构不同,功能也较弱。不推荐在新脚本中使用。
# 使用旧版方法 $htmlContent = iwr "https://www.bing.com" | Select-Object -ExpandProperty Content $htmlContent
总结与对比
| 方法 | 命令 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 推荐 | Invoke-WebRequest |
功能强大,返回结构化对象,易于解析链接、图片、表单等。 | 对于非常大的页面,可能会消耗较多内存。 | 绝大多数场景,特别是需要解析网页内容时。 |
| API专用 | Invoke-RestMethod |
自动解析 JSON,直接得到 PowerShell 对象,非常方便。 | 对于非 JSON 内容(如 HTML),和处理方法一类似。 | 调用 RESTful API,处理 JSON 数据。 |
| 底层 | [System.Net.Http.HttpClient] |
灵活性最高,性能更好(尤其在多次请求时),可精细控制请求细节。 | 代码最复杂,需要手动处理异常和释放资源。 | 需要高度定制化请求、性能要求高的复杂脚本。 |
| 旧版 | iwr |
在非常古老的 PowerShell 版本中可用。 | 功能有限,返回对象结构陈旧,不推荐。 | 维护旧版 PowerShell 脚本。 |
最终建议
对于绝大多数用户和任务,直接使用 Invoke-WebRequest 是最佳选择,它简单、直观且功能强大。
# 一行代码搞定 (Invoke-WebRequest -Uri "https://www.bing.com").Content
