在 PowerShell 中出现 curl 不支持 -L、-C - 等参数的情况,主要是因为你实际使用的并非真正的 curl 工具,而是 PowerShell 对 Invoke-WebRequest 命令的别名(Alias)。
原因解析:
- PowerShell 中的 "curl" 是别名
在默认情况下,PowerShell 会将 curl 映射为内置的 Invoke-WebRequest 命令(类似地,wget 也是它的别名)。
这个内置命令的参数体系与真正的 curl 完全不同,因此不支持 -L(--location)、-C(--continue-at)等原生 curl 的参数。
- 如何区分真假 curl?
运行以下命令可以查看当前 curl 实际指向的程序:
vbnet
Get-Alias curl
-
- 如果输出 curl -> Invoke-WebRequest,说明使用的是 PowerShell 别名。
-
- 如果输出指向 curl.exe,则是真正的 curl 工具。
解决方法:
方法 1:使用真正的 curl 工具
Windows 10 及以上版本已经内置了原生 curl.exe,但需要通过完整文件名调用:
bash
# 用 curl.exe 而非 curl,即可使用 -L、-C 等参数
curl.exe -L -C - "https://example.com/file.zip" -o "file.zip"
方法 2:移除别名(临时生效)
如果希望在当前 PowerShell 会话中直接使用 curl 调用原生工具,可以先移除别名:
ruby
# 移除 curl 对 Invoke-WebRequest 的别名映射
Remove-Item Alias:curl
# 之后直接使用 curl 即可调用原生工具
curl -L -C - "https://example.com/file.zip" -o "file.zip"
方法 3:使用 PowerShell 内置命令的等效参数
如果坚持使用 PowerShell 的 Invoke-WebRequest(即默认的 curl 别名),可以用它的参数实现类似功能:
- 替代 -L(跟随重定向):添加 -MaximumRedirection 参数(默认已启用重定向)
- 替代 -C -(断点续传):使用 -Resume 参数
示例:
bash
# 用 PowerShell 内置命令实现断点续传+跟随重定向
Invoke-WebRequest -Uri "https://example.com/file.zip" -OutFile "file.zip" -Resume -MaximumRedirection 10
总结:
最直接的解决方案是在 PowerShell 中用 curl.exe 代替 curl,即可使用与 Linux 中相同的 -L、-C - 等参数。如果习惯使用 PowerShell 风格的命令,则可以学习 Invoke-WebRequest 的参数体系。