只需一个漂亮的curl 命令即可使用所有默认值调用S3 端点进行下载。在 Mac 上,或者在使用命令行的 PC 上,如果缓存在 CDN 上,我会得到 103MBsec,否则会得到 80MBsec。相同的命令,相同的存储桶,相同的对象,使用“curl.exe”,通过 powershell 调用时我得到 1MBSec。我猜 powershell 做了一些不同的事情导致它变得非常慢?我尝试使用最新的 curl 二进制文件,但仍然相同。 我想当我使用curl命令时我误解了powershell在做什么
curl.exe yourfileonS3 >> output.bin
更新:
PowerShell(核心) v7.4+现在支持外部程序的原始字节处理 - 请参阅这个答案。
因此,以下内容仅适用于 Windows PowerShell 和 PowerShell (Core) v7.3-
briantist的有用答案:
和
>>
实际上是
Out-File
和 Out-File -Append
的别名。因此,
>
和
>>
not 仅仅是字节流管道,事实上,Windows PowerShell 和 PowerShell(核心)直至 v7.3 not 支持发送 raw字节输出到文件。
PowerShell invariously 根据 [string]
报告的字符编码将任何外部程序的输出解码为 text
(
[Console]::OutputEncoding]
实例),然后使用
Out-File
保存到目标文件(可能通过
>
/
>>
),使用该 cmdlet 的默认字符编码重新编码这些字符串(除非在显式
-Encoding
调用中用
Out-File
覆盖)。
这不仅不能保留外部程序的原始字节 输出,它增加了大量的开销。
要进行原始字节处理,请调用 cmd.exe
cmd /c 'curl.exe yourfileonS3 >> output.bin'
请参阅此答案了解更多信息。
[1] 在类 Unix 平台上,使用 sh -c 'curl yourfileonS3 >> output.bin'
mklement0 的回答,了解有关此内容的完整上下文(我建议接受该答案!),重要的是,在 PowerShell 中处理重定向中的字节流是有问题且容易出错,应避免。
>>
(文件重定向)是缓慢的部分。我最初怀疑您可能会调用
curl
(在 Windows PowerShell 中是
Invoke-WebRequest
的别名),但我能够直接在 PowerShell 中重现
curl.exe
与
cmd.exe
之间的速度差异,并测量它,这方式:
# call curl.exe and do redirection in PowerShell
Measure-Command -Expression { curl.exe https://uploader.codecov.io/v0.1.0_6943/linux/codecov >> delme.bin }
del delme.bin
# call cmd.exe and do redirection there
Measure-Command -Expression { & cmd.exe /c 'curl.exe https://uploader.codecov.io/v0.1.0_6943/linux/codecov >> delme.bin' }
del delme.bin
这足以显示出明显的差异。我还确认,与后来的跨平台版本相比,这个问题在 Windows PowerShell 中更严重一些 (
pwsh.exe
)。在 Windows 7.1.0 版本中,上面相同的命令仍然显示出很大的差异。