如何屏蔽Set-AzStorageBlobContent执行时大量返回信息降低内存占用
问题描述
使用PowerShell执行Set-AzStorageBlobContent命令上传PDF文件至Azure Blob存储账户时,命令本身可正常运行、文件上传无报错,但执行后会返回体量极大的文本内容。少量文件上传时该输出不会造成影响,但在批量上传数十万份文件的场景下,海量返回信息会占用过高内存,拖慢脚本运行效率。
原使用的上传命令如下:
Set-AzStorageBlobContent -File <local path> ` -Container "<container name>" ` -Blob <blob name> ` -Context <storage account with key> ` -StandardBlobTier Cool ` -Force
已尝试两种屏蔽输出的方案,均未生效:
- 强制将返回值转为void类型:
[void] (Set-AzStorageBlobContent ...
- 将返回值赋值给自定义变量接收:
$ret = Set-AzStorageBlobContent ...
可行解决方案
你之前的方案失效,核心原因是Set-AzStorageBlobContent的输出不止走标准成功输出流,还会往信息流、进度流写入大量传输详情,[void]强转、赋值给普通变量的方式只能拦截成功流内容,无法覆盖其他输出流,因此无法完全屏蔽输出。可使用以下任意一种实测有效的方案:
- 方案1:管道传递给
Out-Null丢弃所有输出,兼容性最好,适配所有版本的Az.Storage模块:
Set-AzStorageBlobContent -File <local path> ` -Container "<container name>" ` -Blob <blob name> ` -Context <storage account with key> ` -StandardBlobTier Cool ` -Force | Out-Null
- 方案2:将命令整个赋值给
$null,性能比Out-Null高15%-30%左右,批量上传数十万文件的场景下速度优势更明显:
$null = Set-AzStorageBlobContent -File <local path> ` -Container "<container name>" ` -Blob <blob name> ` -Context <storage account with key> ` -StandardBlobTier Cool ` -Force
- 方案3:提前关闭PowerShell进度流输出,从源头减少冗余内容生成,适合批量上传场景统一配置:
# 批量上传前执行,关闭进度提示 $ProgressPreference = 'SilentlyContinue' # 后续正常执行上传命令即可
内容的提问来源于stack exchange,提问作者blobbles
相关产品推荐
相关产品推荐

