You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 22:09:24