如何通过PowerShell从AWS CodeArtifact下载资产文件?
AWS CodeArtifact资产文件PowerShell下载解决方案
问题
需要从AWS CodeArtifact下载一个zip格式的资产文件。已知AWS CLI的实现方式,但团队使用PowerShell,希望借助AWSPowerShell库的Get-CAPackageVersionAsset函数完成操作。执行以下命令后:
Get-CAPackageVersionAsset -Asset MyAsset.3.55.98.zip -Domain mydomain -DomainOwner <aws_account_id> -Format generic -Namespace mynamespace -Package MyAsset -PackageVersion 3.55.98 -Repository myrepo
返回了Amazon.CodeArtifact.Model.GetPackageVersionAssetResponse类型的对象,其Asset属性为Amazon.Runtime.Internal.Util.CachingWrapperStream类型,无法直接完成文件下载。AWS CLI的等效命令aws codeartifact get-package-version-asset有下载路径参数,但PowerShell命令没有,请问如何通过PowerShell实现资产文件的下载?
解决方案
Get-CAPackageVersionAsset返回的Asset属性是一个.NET流对象,你可以通过手动将该流写入本地文件来完成下载,具体代码如下:
# 执行命令获取包含资产流的响应对象 $assetResponse = Get-CAPackageVersionAsset -Asset MyAsset.3.55.98.zip -Domain mydomain -DomainOwner <aws_account_id> -Format generic -Namespace mynamespace -Package MyAsset -PackageVersion 3.55.98 -Repository myrepo # 指定本地文件的保存路径 $localFilePath = "C:\Your\Target\Directory\MyAsset.3.55.98.zip" # 将资产流写入本地文件 try { # 创建本地文件的写入流 $fileStream = [System.IO.File]::Create($localFilePath) # 将资产流的内容复制到文件流 $assetResponse.Asset.CopyTo($fileStream) } finally { # 确保流资源被正确释放,避免文件锁定 if ($fileStream) { $fileStream.Close() } if ($assetResponse.Asset) { $assetResponse.Asset.Close() } }
关键说明
- 与AWS CLI不同,PowerShell的
Get-CAPackageVersionAsset不会直接将文件写入本地,而是返回包含资产内容的流对象 - 使用
.NET的文件流操作可以确保二进制文件(如zip)的内容被完整、正确地写入,避免编码问题 finally块中的流关闭操作是必要的,能防止文件被长期占用导致后续操作失败
内容的提问来源于stack exchange,提问作者Peter May
相关产品推荐
相关产品推荐

