如何用Invoke-WebRequest实现curl获取重定向URL及文件名的功能?
用PowerShell实现与指定Bash命令等效的功能
以下是实现与你提供的Bash命令完全等效的PowerShell脚本,解决Invoke-WebRequest获取真实下载URL和文件名的问题,同时匹配原命令的错误处理逻辑:
# 初始请求URL $url = "https://api.adoptium.net/v3/binary/latest/19/ga/linux/x64/jdk/hotspot/normal/eclipse" try { # 发起请求并跟随重定向,获取完整响应 $response = Invoke-WebRequest -Uri $url -ErrorAction Stop # 提取重定向后的真实下载URL $fetchUrl = $response.BaseResponse.ResponseUri.AbsoluteUri # 解析服务器返回的有效文件名 $fname = $null if ($response.Headers['Content-Disposition'] -match 'filename="?([^"]+)"?') { # 优先从Content-Disposition头提取文件名 $fname = $matches[1] } else { # 若无该头,从最终URL的路径部分提取文件名 $fname = [System.IO.Path]::GetFileName($fetchUrl) } # 将下载内容保存为文件(二进制模式避免编码损坏) $response.Content | Set-Content -Path $fname -Encoding Byte # 可选:输出结果信息 Write-Host "真实下载URL: $fetchUrl" Write-Host "已下载文件: $fname" } catch { # 错误处理:输出错误信息并以非0码退出 Write-Error "操作失败: $($_.Exception.Message)" exit 1 }
关键细节说明:
- 获取真实下载URL:通过
$response.BaseResponse.ResponseUri.AbsoluteUri获取跟随重定向后的最终地址,这是PowerShell中获取重定向后URL的标准方式。 - 解析文件名:优先解析
Content-Disposition响应头(服务器通常会在这里明确指定文件名),如果没有该头,则从URL路径的最后一段提取文件名。 - 错误处理:使用
-ErrorAction Stop触发异常,捕获后输出错误信息并退出,与原Bash命令的错误行为完全一致。 - 二进制文件保存:使用
-Encoding Byte确保下载的二进制文件(如JDK压缩包)不会因编码转换损坏。
如果需要更高效的大文件下载,可以改用Windows原生的BITS服务(后台智能传输服务),示例如下:
$url = "https://api.adoptium.net/v3/binary/latest/19/ga/linux/x64/jdk/hotspot/normal/eclipse" try { # 先获取重定向后的真实URL $headResponse = Invoke-WebRequest -Uri $url -Method Head -ErrorAction Stop $fetchUrl = $headResponse.BaseResponse.ResponseUri.AbsoluteUri # 启动BITS后台下载任务 $job = Start-BitsTransfer -Source $fetchUrl -Destination $PWD -Asynchronous # 等待下载完成 while ($job.JobState -in 'Transferring', 'Connecting') { Start-Sleep -Seconds 2 } # 处理下载结果 if ($job.JobState -eq 'Transferred') { $fname = $job.FileList.LocalName | Split-Path -Leaf Complete-BitsTransfer -BitsJob $job Write-Host "下载完成: $fname" } else { Write-Error "下载失败,状态: $($job.JobState)" Remove-BitsTransfer -BitsJob $job exit 1 } } catch { Write-Error "操作失败: $($_.Exception.Message)" exit 1 }
内容的提问来源于stack exchange,提问作者Thomas Schweikle
相关产品推荐
相关产品推荐

